1da2e3ebdSchin######################################################################## 2da2e3ebdSchin# # 3da2e3ebdSchin# This software is part of the ast package # 4*b30d1939SAndy Fiddaman# Copyright (c) 1982-2012 AT&T Intellectual Property # 5da2e3ebdSchin# and is licensed under the # 6*b30d1939SAndy Fiddaman# Eclipse Public License, Version 1.0 # 77c2fbfb3SApril Chin# by AT&T Intellectual Property # 8da2e3ebdSchin# # 9da2e3ebdSchin# A copy of the License is available at # 10*b30d1939SAndy Fiddaman# http://www.eclipse.org/org/documents/epl-v10.html # 11*b30d1939SAndy Fiddaman# (with md5 checksum b35adb5213ca9657e911e9befb180842) # 12da2e3ebdSchin# # 13da2e3ebdSchin# Information and Software Systems Research # 14da2e3ebdSchin# AT&T Research # 15da2e3ebdSchin# Florham Park NJ # 16da2e3ebdSchin# # 17da2e3ebdSchin# David Korn <dgk@research.att.com> # 18da2e3ebdSchin# # 19da2e3ebdSchin######################################################################## 20da2e3ebdSchinfunction err_exit 21da2e3ebdSchin{ 22da2e3ebdSchin print -u2 -n "\t" 23da2e3ebdSchin print -u2 -r ${Command}[$1]: "${@:2}" 24da2e3ebdSchin let Errors+=1 25da2e3ebdSchin} 26da2e3ebdSchinalias err_exit='err_exit $LINENO' 27da2e3ebdSchin 28da2e3ebdSchininteger Errors=0 29da2e3ebdSchinCommand=${0##*/} 30*b30d1939SAndy Fiddamancompiled='' 31*b30d1939SAndy Fiddamanread -n4 c < $0 2> /dev/null 32*b30d1939SAndy Fiddaman[[ $c == *$'\ck'* ]] && compiled=1 337c2fbfb3SApril Chin 3434f9b3eeSRoland Mainzulimit -c 0 3534f9b3eeSRoland Mainz 3634f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; } 3734f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT 387c2fbfb3SApril Chin 39da2e3ebdSchininteger foo=33 40da2e3ebdSchinbar=bye 41da2e3ebdSchin# check for global variables and $0 42da2e3ebdSchinfunction foobar 43da2e3ebdSchin{ 44da2e3ebdSchin case $1 in 45da2e3ebdSchin 1) print -r - "$foo" "$bar";; 46da2e3ebdSchin 2) print -r - "$0";; 47da2e3ebdSchin 3) typeset foo=foo 48da2e3ebdSchin integer bar=10 49da2e3ebdSchin print -r - "$foo" "$bar";; 50da2e3ebdSchin 4) trap 'foo=36' EXIT 51da2e3ebdSchin typeset foo=20;; 52da2e3ebdSchin esac 53da2e3ebdSchin} 54da2e3ebdSchinfunction print 55da2e3ebdSchin{ 56da2e3ebdSchin command print hi 57da2e3ebdSchin} 58da2e3ebdSchinif [[ $(print) != hi ]] 59da2e3ebdSchinthen err_exit "command print not working inside print function" 60da2e3ebdSchinfi 61da2e3ebdSchinunset -f print 62da2e3ebdSchin 63da2e3ebdSchinif [[ $(foobar 1) != '33 bye' ]] 64da2e3ebdSchinthen err_exit 'global variables not correct' 65da2e3ebdSchinfi 66da2e3ebdSchin 67da2e3ebdSchinif [[ $(foobar 2) != 'foobar' ]] 68da2e3ebdSchinthen err_exit '$0 not correct' 69da2e3ebdSchinfi 70da2e3ebdSchin 71da2e3ebdSchinif [[ $(bar=foo foobar 1) != '33 foo' ]] 72da2e3ebdSchinthen err_exit 'environment override not correct' 73da2e3ebdSchinfi 74da2e3ebdSchinif [[ $bar == foo ]] 75da2e3ebdSchinthen err_exit 'scoping error' 76da2e3ebdSchinfi 77da2e3ebdSchin 78da2e3ebdSchinif [[ $(foobar 3) != 'foo 10' ]] 79da2e3ebdSchinthen err_exit non-local variables 80da2e3ebdSchinfi 81da2e3ebdSchin 82da2e3ebdSchinfoobar 4 83da2e3ebdSchinif [[ $foo != 36 ]] 84da2e3ebdSchinthen err_exit EXIT trap in wrong scope 85da2e3ebdSchinfi 86da2e3ebdSchinunset -f foobar || err_exit "cannot unset function foobar" 87da2e3ebdSchintypeset -f foobar>/dev/null && err_exit "typeset -f has incorrect exit status" 88da2e3ebdSchin 89da2e3ebdSchinfunction foobar 90da2e3ebdSchin{ 91da2e3ebdSchin (return 0) 92da2e3ebdSchin} 9334f9b3eeSRoland Mainz> $tmp/test1 94da2e3ebdSchin{ 95da2e3ebdSchinfoobar 9634f9b3eeSRoland Mainzif [ -r $tmp/test1 ] 9734f9b3eeSRoland Mainzthen rm -r $tmp/test1 98da2e3ebdSchinelse err_exit 'return within subshell inside function error' 99da2e3ebdSchinfi 100da2e3ebdSchin} 101da2e3ebdSchinabc() print hi 102da2e3ebdSchinif [[ $(abc) != hi ]] 103da2e3ebdSchinthen err_exit 'abc() print hi not working' 104da2e3ebdSchinfi 105da2e3ebdSchin( unset -f abc ) 106da2e3ebdSchinif [[ $(abc 2>/dev/null) != hi ]] 107da2e3ebdSchinthen err_exit 'abc() print hi not working after subshell unset' 108da2e3ebdSchinfi 109da2e3ebdSchin( 110da2e3ebdSchin function f 111da2e3ebdSchin { 112da2e3ebdSchin exit 1 113da2e3ebdSchin } 114da2e3ebdSchin f 115da2e3ebdSchin err_exit 'exit from function not working' 116da2e3ebdSchin) 117da2e3ebdSchinunset -f foo 118da2e3ebdSchinfunction foo 119da2e3ebdSchin{ 120da2e3ebdSchin x=2 121da2e3ebdSchin ( 122da2e3ebdSchin x=3 1237c2fbfb3SApril Chin cd $tmp 124da2e3ebdSchin print bar 125da2e3ebdSchin ) 126da2e3ebdSchin if [[ $x != 2 ]] 127da2e3ebdSchin then err_exit 'value of x not restored after subshell inside function' 128da2e3ebdSchin fi 129da2e3ebdSchin} 130da2e3ebdSchinx=1 131da2e3ebdSchindir=$PWD 132da2e3ebdSchinif [[ $(foo) != bar ]] 133da2e3ebdSchinthen err_exit 'cd inside nested subshell not working' 134da2e3ebdSchinfi 135da2e3ebdSchinif [[ $PWD != "$dir" ]] 136da2e3ebdSchinthen err_exit 'cd inside nested subshell changes $PWD' 137da2e3ebdSchinfi 138da2e3ebdSchinfun() /bin/echo hello 139da2e3ebdSchinif [[ $(fun) != hello ]] 140da2e3ebdSchinthen err_exit one line functions not working 141da2e3ebdSchinfi 14234f9b3eeSRoland Mainzcat > $tmp/script <<-\! 143da2e3ebdSchin print -r -- "$1" 144da2e3ebdSchin! 14534f9b3eeSRoland Mainzchmod +x $tmp/script 146da2e3ebdSchinfunction passargs 147da2e3ebdSchin{ 14834f9b3eeSRoland Mainz $tmp/script "$@" 149da2e3ebdSchin} 150da2e3ebdSchinif [[ $(passargs one) != one ]] 151da2e3ebdSchinthen err_exit 'passing args from functions to scripts not working' 152da2e3ebdSchinfi 15334f9b3eeSRoland Mainzcat > $tmp/script <<-\! 154da2e3ebdSchin trap 'exit 0' EXIT 155da2e3ebdSchin function foo 156da2e3ebdSchin { 15734f9b3eeSRoland Mainz /tmp > /dev/null 2>&1 158da2e3ebdSchin } 159da2e3ebdSchin foo 160da2e3ebdSchin! 16134f9b3eeSRoland Mainzif ! $tmp/script 16234f9b3eeSRoland Mainzthen err_exit 'exit trap incorrectly triggered' 163da2e3ebdSchinfi 16434f9b3eeSRoland Mainzif ! $SHELL -c $tmp/script 16534f9b3eeSRoland Mainzthen err_exit 'exit trap incorrectly triggered when invoked with -c' 166da2e3ebdSchinfi 16734f9b3eeSRoland Mainz$SHELL -c "trap 'rm $tmp/script' EXIT" 16834f9b3eeSRoland Mainzif [[ -f $tmp/script ]] 16934f9b3eeSRoland Mainzthen err_exit 'exit trap not triggered when invoked with -c' 170da2e3ebdSchinfi 17134f9b3eeSRoland Mainzcat > $tmp/script <<- \EOF 172da2e3ebdSchin foobar() 173da2e3ebdSchin { 174da2e3ebdSchin return 175da2e3ebdSchin } 176da2e3ebdSchin shift 177da2e3ebdSchin foobar 178da2e3ebdSchin print -r -- "$1" 179da2e3ebdSchinEOF 18034f9b3eeSRoland Mainzchmod +x $tmp/script 18134f9b3eeSRoland Mainzif [[ $( $SHELL $tmp/script arg1 arg2) != arg2 ]] 182da2e3ebdSchinthen err_exit 'arguments not restored by posix functions' 183da2e3ebdSchinfi 184da2e3ebdSchinfunction foo 185da2e3ebdSchin{ 186da2e3ebdSchin print hello 187da2e3ebdSchin} 188da2e3ebdSchin( 189da2e3ebdSchin function foo 190da2e3ebdSchin { 191da2e3ebdSchin print bar 192da2e3ebdSchin } 193da2e3ebdSchin if [[ $(foo) != bar ]] 194da2e3ebdSchin then err_exit 'function definitions inside subshells not working' 195da2e3ebdSchin fi 196da2e3ebdSchin) 197da2e3ebdSchinif [[ $(foo) != hello ]] 198da2e3ebdSchinthen err_exit 'function definitions inside subshells not restored' 199da2e3ebdSchinfi 200da2e3ebdSchinunset -f foo bar 201da2e3ebdSchinfunction bar 202da2e3ebdSchin{ 203da2e3ebdSchin print "$y" 204da2e3ebdSchin} 205da2e3ebdSchin 206da2e3ebdSchinfunction foo 207da2e3ebdSchin{ 208da2e3ebdSchin typeset x=3 209da2e3ebdSchin y=$x bar 210da2e3ebdSchin} 211da2e3ebdSchinx=1 212da2e3ebdSchinif [[ $(foo) != 3 ]] 213da2e3ebdSchinthen err_exit 'variable assignment list not using parent scope' 214da2e3ebdSchinfi 21534f9b3eeSRoland Mainzunset -f foobar 21634f9b3eeSRoland Mainzcat > $tmp/foobar <<! 21734f9b3eeSRoland Mainzfunction foobar 218da2e3ebdSchin{ 219da2e3ebdSchin print foo 220da2e3ebdSchin} 221da2e3ebdSchin! 22234f9b3eeSRoland Mainzchmod +x $tmp/foobar 2237c2fbfb3SApril ChinFPATH=$tmp 22434f9b3eeSRoland Mainzautoload foobar 22534f9b3eeSRoland Mainzif [[ $(foobar 2>/dev/null) != foo ]] 226da2e3ebdSchinthen err_exit 'autoload not working' 227da2e3ebdSchinfi 228da2e3ebdSchinunset -f foobar 229da2e3ebdSchinfunction foobar 230da2e3ebdSchin{ 231da2e3ebdSchin typeset -r x=3 232da2e3ebdSchin return 0 233da2e3ebdSchin} 234da2e3ebdSchin( foobar ) 2> /dev/null || err_exit "cannot unset readonly variable in function" 23534f9b3eeSRoland Mainzif $SHELL -n 2> /dev/null <<-! 236da2e3ebdSchin abc() 237da2e3ebdSchin ! 238da2e3ebdSchinthen err_exit 'abc() without a function body is not a syntax error' 239da2e3ebdSchinfi 240da2e3ebdSchinfunction winpath 241da2e3ebdSchin{ 24234f9b3eeSRoland Mainz usage='q pathname ...' 243da2e3ebdSchin typeset var format=s 244da2e3ebdSchin while getopts "$usage" var 245da2e3ebdSchin do case $var in 246da2e3ebdSchin q) format=q;; 247da2e3ebdSchin esac 248da2e3ebdSchin done 249da2e3ebdSchin print done 250da2e3ebdSchin} 251da2e3ebdSchinif [[ $( (winpath --man 2>/dev/null); print ok) != ok ]] 252da2e3ebdSchinthen err_exit 'getopts --man in functions not working' 253da2e3ebdSchinfi 254da2e3ebdSchinif [[ $( (winpath -z 2>/dev/null); print ok) != ok ]] 255da2e3ebdSchinthen err_exit 'getopts with bad option in functions not working' 256da2e3ebdSchinfi 257da2e3ebdSchinunset -f x 258da2e3ebdSchinfunction x 259da2e3ebdSchin{ 260da2e3ebdSchin print "$@" 261da2e3ebdSchin} 262da2e3ebdSchintypeset -ft x 263da2e3ebdSchinif [[ $(x x=y 2>/dev/null) != x=y ]] 264da2e3ebdSchinthen err_exit 'name=value pair args not passed to traced functions' 265da2e3ebdSchinfi 266da2e3ebdSchinfunction bad 267da2e3ebdSchin{ 268da2e3ebdSchin false 269da2e3ebdSchin} 270da2e3ebdSchintrap 'val=false' ERR 271da2e3ebdSchinval=true 272da2e3ebdSchinbad 273da2e3ebdSchinif [[ $val != false ]] 274da2e3ebdSchinthen err_exit 'set -e not working for functions' 275da2e3ebdSchinfi 276da2e3ebdSchinfunction bad 277da2e3ebdSchin{ 278da2e3ebdSchin false 279da2e3ebdSchin return 0 280da2e3ebdSchin} 281da2e3ebdSchinval=true 282da2e3ebdSchinbad 283da2e3ebdSchinif [[ $val != true ]] 284da2e3ebdSchinthen err_exit 'set -e not disabled for functions' 285da2e3ebdSchinfi 286da2e3ebdSchinbad() 287da2e3ebdSchin{ 288da2e3ebdSchin false 289da2e3ebdSchin return 0 290da2e3ebdSchin} 291da2e3ebdSchinval=true 292da2e3ebdSchinbad 293da2e3ebdSchinif [[ $val != false ]] 294da2e3ebdSchinthen err_exit 'set -e not inherited for posix functions' 295da2e3ebdSchinfi 2967c2fbfb3SApril Chintrap - ERR 2977c2fbfb3SApril Chin 29834f9b3eeSRoland Mainzfunction myexport 299da2e3ebdSchin{ 300da2e3ebdSchin nameref var=$1 301da2e3ebdSchin if (( $# > 1 )) 302da2e3ebdSchin then export $1=$2 303da2e3ebdSchin fi 304da2e3ebdSchin if (( $# > 2 )) 305da2e3ebdSchin then print $(myexport "$1" "$3" ) 306da2e3ebdSchin return 307da2e3ebdSchin fi 308da2e3ebdSchin typeset val 309da2e3ebdSchin val=$(export | grep "^$1=") 310da2e3ebdSchin print ${val#"$1="} 311da2e3ebdSchin} 312da2e3ebdSchinexport dgk=base 3137c2fbfb3SApril Chinval=$(myexport dgk fun) 3147c2fbfb3SApril Chinif [[ $val != fun ]] 3157c2fbfb3SApril Chinthen err_exit "export inside function not working -- expected 'fun', got '$val'" 316da2e3ebdSchinfi 3177c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//') 3187c2fbfb3SApril Chinif [[ $val != base ]] 3197c2fbfb3SApril Chinthen err_exit "export not restored after function call -- expected 'base', got '$val'" 320da2e3ebdSchinfi 3217c2fbfb3SApril Chinval=$(myexport dgk fun fun2) 3227c2fbfb3SApril Chinif [[ $val != fun2 ]] 3237c2fbfb3SApril Chinthen err_exit "export inside function not working with recursive function -- expected 'fun2', got '$val'" 324da2e3ebdSchinfi 3257c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//') 3267c2fbfb3SApril Chinif [[ $val != base ]] 3277c2fbfb3SApril Chinthen err_exit "export not restored after recursive function call -- expected 'base', got '$val'" 328da2e3ebdSchinfi 3297c2fbfb3SApril Chinval=$(dgk=try3 myexport dgk) 3307c2fbfb3SApril Chinif [[ $val != try3 ]] 3317c2fbfb3SApril Chinthen err_exit "name=value not added to export list with function call -- expected 'try3', got '$val'" 332da2e3ebdSchinfi 3337c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//') 3347c2fbfb3SApril Chinif [[ $val != base ]] 3357c2fbfb3SApril Chinthen err_exit "export not restored name=value function call -- expected 'base', got '$val'" 336da2e3ebdSchinfi 337da2e3ebdSchinunset zzz 3387c2fbfb3SApril Chinval=$(myexport zzz fun) 3397c2fbfb3SApril Chinif [[ $val != fun ]] 3407c2fbfb3SApril Chinthen err_exit "export inside function not working -- expected 'fun', got '$val'" 341da2e3ebdSchinfi 3427c2fbfb3SApril Chinval=$(export | sed -e '/^zzz=/!d' -e 's/^zzz=//') 3437c2fbfb3SApril Chinif [[ $val ]] 3447c2fbfb3SApril Chinthen err_exit "unset varaible exported after function call -- expected '', got '$val'" 345da2e3ebdSchinfi 3467c2fbfb3SApril Chin 347da2e3ebdSchinunset zzz 348da2e3ebdSchintypeset -u zzz 349da2e3ebdSchinfunction foo 350da2e3ebdSchin{ 351da2e3ebdSchin zzz=abc 352da2e3ebdSchin print $zzz 353da2e3ebdSchin} 354da2e3ebdSchinif [[ $(foo)$(foo) != ABCABC ]] 355da2e3ebdSchinthen err_exit 'attributes on unset variables not saved/restored' 356da2e3ebdSchinfi 357da2e3ebdSchinfunction xpd { 358da2e3ebdSchin typeset i j=$1 359da2e3ebdSchin for i 360da2e3ebdSchin do print i=$i j=$j 361da2e3ebdSchin [[ $i == a ]] && xpd b 362da2e3ebdSchin done 363da2e3ebdSchin } 364da2e3ebdSchinif [[ $(xpd a c) != $'i=a j=a\ni=b j=b\ni=c j=a' ]] 365da2e3ebdSchinthen err_exit 'for loop function optimization error' 366da2e3ebdSchinfi 367da2e3ebdSchin 368da2e3ebdSchintypeset -A visited 369da2e3ebdSchininteger level=0 370da2e3ebdSchinfunction closure 371da2e3ebdSchin{ 372da2e3ebdSchin (( $# > 5 )) && return 1 373da2e3ebdSchin ((level < 2)) && ((level++)) 374da2e3ebdSchin typeset tmp r=0 375da2e3ebdSchin visited[$1]=1 376da2e3ebdSchin 377da2e3ebdSchin for tmp in $level _$level 378da2e3ebdSchin do 379da2e3ebdSchin [[ ${visited[$tmp]} == 1 ]] && continue 380da2e3ebdSchin closure $tmp $* || r=1 381da2e3ebdSchin done 382da2e3ebdSchin return $r 383da2e3ebdSchin} 384da2e3ebdSchinclosure 0 || err_exit -u2 'for loop function optimization bug2' 38534f9b3eeSRoland Mainzdir=$tmp/dir 38634f9b3eeSRoland Mainzmkdir $dir 38734f9b3eeSRoland Mainzcd $dir || { err_exit "cd $dir failed"; exit 1; } 38834f9b3eeSRoland Mainz 38934f9b3eeSRoland Mainz( 39034f9b3eeSRoland Mainz function a { 39134f9b3eeSRoland Mainz print a 39234f9b3eeSRoland Mainz } 39334f9b3eeSRoland Mainz function b { 39434f9b3eeSRoland Mainz print 1 39534f9b3eeSRoland Mainz a 39634f9b3eeSRoland Mainz print 2 39734f9b3eeSRoland Mainz } > /dev/null 39834f9b3eeSRoland Mainz typeset -ft a b 39934f9b3eeSRoland Mainz PS4=X 40034f9b3eeSRoland Mainz b 40134f9b3eeSRoland Mainz) > file 2>&1 40234f9b3eeSRoland Mainz[[ $(<file) == *'Xprint 2'* ]] || err_exit 'function trace disabled by function call' 40334f9b3eeSRoland Mainzrm -f file 40434f9b3eeSRoland Mainz 405da2e3ebdSchinprint 'false' > try 406da2e3ebdSchinchmod +x try 407da2e3ebdSchincat > tst <<- EOF 408da2e3ebdSchin function ignore 409da2e3ebdSchin { 410da2e3ebdSchin ./try 411da2e3ebdSchin return 0 412da2e3ebdSchin } 413da2e3ebdSchin trap "print error; exit 1" ERR 414da2e3ebdSchin ignore 415da2e3ebdSchinEOF 416da2e3ebdSchinif [[ $($SHELL < tst) == error ]] 417da2e3ebdSchinthen err_exit 'ERR trap not cleared' 418da2e3ebdSchinfi 41934f9b3eeSRoland MainzFPATH=$dir 42034f9b3eeSRoland Mainzprint ': This does nothing' > foobar 42134f9b3eeSRoland Mainzchmod +x foobar 42234f9b3eeSRoland Mainzunset -f foobar 42334f9b3eeSRoland Mainz{ foobar; } 2>/dev/null 42434f9b3eeSRoland Mainzgot=$? 42534f9b3eeSRoland Mainzexp=126 42634f9b3eeSRoland Mainzif [[ $got != $exp ]] 42734f9b3eeSRoland Mainzthen err_exit "function file without function definition processes wrong error -- expected '$exp', got '$got'" 428da2e3ebdSchinfi 42934f9b3eeSRoland Mainzprint 'set a b c' > dotscript 430da2e3ebdSchin[[ $(PATH=$PATH: $SHELL -c '. dotscript;print $#') == 3 ]] || err_exit 'positional parameters not preserved with . script without arguments' 431da2e3ebdSchincd ~- || err_exit "cd back failed" 432da2e3ebdSchinfunction errcheck 433da2e3ebdSchin{ 434da2e3ebdSchin trap 'print ERR; return 1' ERR 435da2e3ebdSchin false 436da2e3ebdSchin print ok 437da2e3ebdSchin} 438da2e3ebdSchinerr=$(errcheck) 439da2e3ebdSchin[[ $err == ERR ]] || err_exit 'trap on ERR not working in a function' 440da2e3ebdSchinx="$( 441da2e3ebdSchin function foobar 442da2e3ebdSchin { 443da2e3ebdSchin print ok 444da2e3ebdSchin } 445da2e3ebdSchin typeset -f foobar 446da2e3ebdSchin)" 447da2e3ebdSchineval "$x" || err_exit 'typeset -f generates syntax error' 448da2e3ebdSchin[[ $(foobar) != ok ]] && err_exit 'typeset -f not generating function' 449da2e3ebdSchinunset -f a b c 450da2e3ebdSchina() 451da2e3ebdSchin{ 452da2e3ebdSchin b 453da2e3ebdSchin b 454da2e3ebdSchin print ${.sh.fun} 455da2e3ebdSchin} 456da2e3ebdSchinb() { : ;} 457da2e3ebdSchin[[ $(a) == a ]] || err_exit '.sh.fun not set correctly in a function' 458da2e3ebdSchinprint $'a(){\ndate\n}' | $SHELL 2> /dev/null || err_exit 'parser error in a(){;date;}' 45934f9b3eeSRoland Mainzcat > $tmp/data1 << '++EOF' 460da2e3ebdSchin 1 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 461da2e3ebdSchin 2 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 462da2e3ebdSchin 3 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 463da2e3ebdSchin 4 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 464da2e3ebdSchin 5 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 465da2e3ebdSchin 6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 466da2e3ebdSchin 7 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 467da2e3ebdSchin 8 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 468da2e3ebdSchin 9 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 469da2e3ebdSchin 10 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 470da2e3ebdSchin 11 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 471da2e3ebdSchin 12 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 472da2e3ebdSchin 13 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 473da2e3ebdSchin 14 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 474da2e3ebdSchin 15 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 475da2e3ebdSchin 16 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 476da2e3ebdSchin 17 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 477da2e3ebdSchin 18 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 478da2e3ebdSchin 19 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 479da2e3ebdSchin 20 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 480da2e3ebdSchin++EOF 48134f9b3eeSRoland Mainzcat > $tmp/script << '++EOF' 482da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 483da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 484da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 485da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 486da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 487da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 488da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 489da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 490da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 491da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 492da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 493da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 494da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 495da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 496da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 497da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 498da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 499da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 500da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 501da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 502da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 503da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 504da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 505da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 506da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 507da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 508da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 509da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 510da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 511da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 512da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 513da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 514da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 515da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 516da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 517da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 518da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 519da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 520da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 521da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 522da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 523da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 524da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 525da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 526da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 527da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 528da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 529da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 530da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 531da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 532da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 533da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 534da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 535da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 536da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 537da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 538da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 539da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 540da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 541da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 542da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 543da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 544da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 545da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 546da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 547da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 548da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 549da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 550da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 551da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 552da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 553da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 554da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 555da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 556da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 557da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 558da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 559da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 560da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 561da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 562da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 563da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 564da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 565da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 566da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 567da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 568da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 569da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 570da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 571da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 572da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 573da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 574da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 575da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 576da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 577da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 578da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 579da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 580da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 581da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 582da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 583da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 584da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 585da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 586da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 587da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 588da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 589da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 590da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 591da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 592da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 593da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 594da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 595da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 596da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 597da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 598da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 599da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 600da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 601da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 602da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 603da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 604da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 605da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 606da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 607da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 608da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 609da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 610da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 611da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 612da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 613da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 614da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 615da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 616da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 617da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 618da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 619da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 620da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 621da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 622da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 623da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 624da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 625da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 626da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 627da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 628da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 629da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 630da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 631da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 632da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 633da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 634da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 635da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 636da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 637da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 638da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 639da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 640da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 641da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 642da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 643da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 644da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 645da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 646da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 647da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 648da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 649da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 650da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 651da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 652da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 653da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 654da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 655da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 656da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 657da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 658da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 659da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 660da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 661da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 662da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 663da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 664da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 665da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 666da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 667da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 668da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 669da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 670da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 671da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 672da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 673da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 674da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 675da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 676da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 677da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 678da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 679da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 680da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 681da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 682da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 683da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 684da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 685da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 686da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 687da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 688da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 689da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 690da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 691da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 692da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 693da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 694da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 695da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 696da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 697da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 698da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 699da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 700da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 701da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 702da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 703da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 704da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 705da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 706da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 707da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 708da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 709da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 710da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 711da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 712da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 713da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 714da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 715da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 716da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 717da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 718da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 719da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 720da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 721da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 722da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 723da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 724da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 725da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 726da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 727da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 728da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 729da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 730da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 731da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 732da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 733da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 734da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 735da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 736da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 737da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 738da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 739da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 740da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 741da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 742da2e3ebdSchin 743da2e3ebdSchinf() 744da2e3ebdSchin{ 745da2e3ebdSchincat <<\M 746da2e3ebdSchin++EOF 74734f9b3eeSRoland Mainzcat $tmp/data1 >> $tmp/script 74834f9b3eeSRoland Mainzprintf 'M\n}\n\nf\n\n' >> $tmp/script 74934f9b3eeSRoland Mainz$SHELL -c $tmp/script > $tmp/data2 75034f9b3eeSRoland Mainzcmp -s $tmp/data[12] || err_exit 'error with long functions' 751da2e3ebdSchinv=1 752da2e3ebdSchinfunction f 753da2e3ebdSchin{ 754da2e3ebdSchin typeset i 755da2e3ebdSchin for i in 0 1 756da2e3ebdSchin do typeset v 757da2e3ebdSchin v=$i 758da2e3ebdSchin [[ $v == $i ]] || return 1 759da2e3ebdSchin done 760da2e3ebdSchin} 761da2e3ebdSchinf || err_exit "typeset optimization bug" 762da2e3ebdSchinfunction f 763da2e3ebdSchin{ 764da2e3ebdSchin print -r -- "$foo$bar" 765da2e3ebdSchin} 766da2e3ebdSchinfunction g 767da2e3ebdSchin{ 768da2e3ebdSchin print -r -- $(bar=bam f) 769da2e3ebdSchin} 770da2e3ebdSchinunset foo bar 771da2e3ebdSchin[[ $(foo=hello g) == hellobam ]] || err_exit 'function exports not passed on' 772da2e3ebdSchin[[ $(bar=hello g) == bam ]] || err_exit 'function exports not overridden' 773da2e3ebdSchinunset -f foo 774da2e3ebdSchinfunction foo 775da2e3ebdSchin{ 776da2e3ebdSchin typeset line=$1 777da2e3ebdSchin set +n 778da2e3ebdSchin while [[ $line ]] 779da2e3ebdSchin do if [[ ! $varname ]] 780da2e3ebdSchin then varname=${line%% *} 781da2e3ebdSchin line=${line##"$varname"?( )} 782da2e3ebdSchin [[ $line ]] && continue 783da2e3ebdSchin else print ok 784da2e3ebdSchin return 785da2e3ebdSchin fi 786da2e3ebdSchin varname= 787da2e3ebdSchin done 788da2e3ebdSchin} 789da2e3ebdSchin[[ $(foo 'NUMBERED RECORDSIZE') == ok ]] || err_exit 'optimization error with undefined variable' 7907c2fbfb3SApril Chinunset x 7917c2fbfb3SApril Chinx=$( 7927c2fbfb3SApril Chin set -e 7937c2fbfb3SApril Chin integer count=0 7947c2fbfb3SApril Chin function err_f 7957c2fbfb3SApril Chin { 79634f9b3eeSRoland Mainz if ((count++==3)) 7977c2fbfb3SApril Chin then print failed 7987c2fbfb3SApril Chin else false 7997c2fbfb3SApril Chin fi 8007c2fbfb3SApril Chin } 8017c2fbfb3SApril Chin trap 'err_f' ERR 8027c2fbfb3SApril Chin false 8037c2fbfb3SApril Chin) 8047c2fbfb3SApril Chin[[ $x == failed ]] && err_exit 'ERR trap executed multiple times' 8057c2fbfb3SApril Chinexport environment 8067c2fbfb3SApril Chintypeset global 8077c2fbfb3SApril Chinfunction f 8087c2fbfb3SApril Chin{ 8097c2fbfb3SApril Chin typeset i t local 8107c2fbfb3SApril Chin 8117c2fbfb3SApril Chin for i 8127c2fbfb3SApril Chin do case $i in 8137c2fbfb3SApril Chin [-+]*) set "$@" 8147c2fbfb3SApril Chin continue 8157c2fbfb3SApril Chin ;; 8167c2fbfb3SApril Chin local) local=f 8177c2fbfb3SApril Chin t=$(typeset +f $local) 8187c2fbfb3SApril Chin ;; 8197c2fbfb3SApril Chin global) global=f 8207c2fbfb3SApril Chin t=$(typeset +f $global) 8217c2fbfb3SApril Chin ;; 8227c2fbfb3SApril Chin environment) 8237c2fbfb3SApril Chin environment=f 8247c2fbfb3SApril Chin t=$(typeset +f $environment) 8257c2fbfb3SApril Chin ;; 8267c2fbfb3SApril Chin literal)t=$(typeset +f f) 8277c2fbfb3SApril Chin ;; 8287c2fbfb3SApril Chin positional) 8297c2fbfb3SApril Chin set -- f 8307c2fbfb3SApril Chin t=$(typeset +f $1) 8317c2fbfb3SApril Chin ;; 8327c2fbfb3SApril Chin esac 8337c2fbfb3SApril Chin [[ $t ]] || err_exit "typeset +f \$$i failed" 8347c2fbfb3SApril Chin done 8357c2fbfb3SApril Chin} 8367c2fbfb3SApril Chinf local global environment literal positional 8377c2fbfb3SApril Chin$SHELL -c ' 83834f9b3eeSRoland Mainz print exit 0 > '$tmp'/script 83934f9b3eeSRoland Mainz chmod +x '$tmp'/script 8407c2fbfb3SApril Chin unset var 8417c2fbfb3SApril Chin var=( ident=1 ) 8427c2fbfb3SApril Chin function fun 8437c2fbfb3SApril Chin { 84434f9b3eeSRoland Mainz PATH='$tmp' script 8457c2fbfb3SApril Chin } 8467c2fbfb3SApril Chin fun 8477c2fbfb3SApril Chin' || err_exit "compound variable cleanup before script exec failed" 84834f9b3eeSRoland Mainz( $SHELL << \++EOF++ 8497c2fbfb3SApril Chinfunction main 8507c2fbfb3SApril Chin{ 8517c2fbfb3SApril Chin typeset key 8527c2fbfb3SApril Chin typeset -A entry 8537c2fbfb3SApril Chin entry[a]=( value=aaa ) 8547c2fbfb3SApril Chin} 8557c2fbfb3SApril Chinmain 8567c2fbfb3SApril Chin++EOF++ 8577c2fbfb3SApril Chin) 2> /dev/null || err_exit 'function main fails' 8587c2fbfb3SApril Chinoptind=$OPTIND 8597c2fbfb3SApril Chinsub() 8607c2fbfb3SApril Chin{ 8617c2fbfb3SApril Chin ( 8627c2fbfb3SApril Chin OPTIND=1 8637c2fbfb3SApril Chin while getopts :abc OPTION "$@" 8647c2fbfb3SApril Chin do print OPTIND=$OPTIND 8657c2fbfb3SApril Chin done 8667c2fbfb3SApril Chin ) 8677c2fbfb3SApril Chin} 8687c2fbfb3SApril Chin[[ $(sub -a) == OPTIND=2 ]] || err_exit 'OPTIND should be 2' 8697c2fbfb3SApril Chin[[ $(sub -a) == OPTIND=2 ]] || err_exit 'OPTIND should be 2 again' 8707c2fbfb3SApril Chin[[ $OPTIND == "$optind" ]] || err_exit 'OPTIND should be 1' 8717c2fbfb3SApril Chin 8727c2fbfb3SApril Chinfunction bar 8737c2fbfb3SApril Chin{ 8747c2fbfb3SApril Chin [[ -o nounset ]] && err_exit 'nounset option should not be inherited' 8757c2fbfb3SApril Chin} 8767c2fbfb3SApril Chinfunction foo 8777c2fbfb3SApril Chin{ 8787c2fbfb3SApril Chin set -o nounset 8797c2fbfb3SApril Chin bar 8807c2fbfb3SApril Chin} 8817c2fbfb3SApril Chinset +o nounset 8827c2fbfb3SApril Chinfoo 8837c2fbfb3SApril Chinfunction red 8847c2fbfb3SApril Chin{ 8857c2fbfb3SApril Chin integer -S d=0 8867c2fbfb3SApril Chin printf 'red_one %d\n' d 8877c2fbfb3SApril Chin (( d++ )) 8887c2fbfb3SApril Chin return 0 8897c2fbfb3SApril Chin} 8907c2fbfb3SApril Chin[[ ${ red } != 'red_one 0' ]] && err_exit 'expected red_one 0' 8917c2fbfb3SApril Chin[[ ${ red } != 'red_one 1' ]] && err_exit 'expected red_one 1' 8927c2fbfb3SApril Chinxyz=$0 8937c2fbfb3SApril Chinfunction traceback 8947c2fbfb3SApril Chin{ 8957c2fbfb3SApril Chin integer .level=.sh.level 8967c2fbfb3SApril Chin while((--.level>=0)) 8977c2fbfb3SApril Chin do 8987c2fbfb3SApril Chin ((.sh.level = .level)) 8997c2fbfb3SApril Chin [[ $xyz == "$0" ]] || err_exit "\$xyz=$xyz does not match $0 on level ${.level}" 9007c2fbfb3SApril Chin [[ ${.sh.lineno} == "$1" ]] || err_exit "\${.sh.lineno}=${.sh.lineno} does not match $1 on level ${.level}" 9017c2fbfb3SApril Chin done 9027c2fbfb3SApril Chin} 9037c2fbfb3SApril Chin 9047c2fbfb3SApril Chinfunction foo 9057c2fbfb3SApril Chin{ 9067c2fbfb3SApril Chin typeset xyz=foo 9077c2fbfb3SApril Chin set -- $((LINENO+1)) 9087c2fbfb3SApril Chin bar $LINENO "$1" 9097c2fbfb3SApril Chin} 9107c2fbfb3SApril Chin 9117c2fbfb3SApril Chinfunction bar 9127c2fbfb3SApril Chin{ 9137c2fbfb3SApril Chin typeset xyz=bar 9147c2fbfb3SApril Chin set -- $((LINENO+2)) 9157c2fbfb3SApril Chin trap 'traceback $LINENO' DEBUG 9167c2fbfb3SApril Chin : $LINENO "$1" 9177c2fbfb3SApril Chin} 9187c2fbfb3SApril Chin 9197c2fbfb3SApril Chinset -- $((LINENO+1)) 9207c2fbfb3SApril Chinfoo $LINENO 9217c2fbfb3SApril Chinfunction .sh.fun.set 9227c2fbfb3SApril Chin{ 9237c2fbfb3SApril Chin print -r -- "${.sh.value}" 9247c2fbfb3SApril Chin} 9257c2fbfb3SApril Chinfunction abc 9267c2fbfb3SApril Chin{ 9277c2fbfb3SApril Chin : 9287c2fbfb3SApril Chin} 9297c2fbfb3SApril Chindef() 9307c2fbfb3SApril Chin{ 9317c2fbfb3SApril Chin : 9327c2fbfb3SApril Chin} 9337c2fbfb3SApril Chin[[ $(abc) == abc ]] || err_exit '.sh.fun.set not capturing function name' 9347c2fbfb3SApril Chin[[ $(def) == def ]] || err_exit '.sh.fun.set not capturing name()' 9357c2fbfb3SApril Chinunset -f .sh.fun.set 9367c2fbfb3SApril Chin 9377c2fbfb3SApril Chin# tests for debug functions 9387c2fbfb3SApril Chinbasefile=${.sh.file} 9397c2fbfb3SApril Chininteger baseline 94034f9b3eeSRoland Mainzcat > $tmp/debug << \+++ 9417c2fbfb3SApril Chin : line 1 9427c2fbfb3SApril Chin 9437c2fbfb3SApril Chin : line 3 9447c2fbfb3SApril Chin+++ 9457c2fbfb3SApril Chin# Print one line in a call stack 9467c2fbfb3SApril Chinfunction _Dbg_print_frame 9477c2fbfb3SApril Chin{ 9487c2fbfb3SApril Chin typeset -i pos=$1 9497c2fbfb3SApril Chin typeset fn=$2 9507c2fbfb3SApril Chin typeset filename="$3" 9517c2fbfb3SApril Chin typeset -i line=$4 9527c2fbfb3SApril Chin typeset arg=$5 9537c2fbfb3SApril Chin shift 5 9547c2fbfb3SApril Chin if ((pos==0)) 9557c2fbfb3SApril Chin then [[ $filename == "$basefile" ]] || err_exit "filename for level 0 is $filename not $basename" 9567c2fbfb3SApril Chin [[ $arg == DEBUG ]] && ((baseline++)) 9577c2fbfb3SApril Chin [[ $line == "$baseline" ]] || err_exit "line number for level 0 is $line not $baseline" 9587c2fbfb3SApril Chin elif ((pos==1)) 95934f9b3eeSRoland Mainz then [[ $filename == "$tmp/debug" ]] || err_exit "filename for level 1 is $filename not $tmp/debug" 9607c2fbfb3SApril Chin [[ $* == 'foo bar' ]] || err_exit "args are '$*', not 'foo bar'" 9617c2fbfb3SApril Chin [[ $line == $arg ]] || err_exit "line number for level 1 is $line not $arg" 9627c2fbfb3SApril Chin else err_exit "level should be 0 or 1 but is $pos" 9637c2fbfb3SApril Chin fi 9647c2fbfb3SApril Chin} 9657c2fbfb3SApril Chin 9667c2fbfb3SApril Chinfunction _Dbg_debug_trap_handler 9677c2fbfb3SApril Chin{ 9687c2fbfb3SApril Chin 9697c2fbfb3SApril Chin integer .level=.sh.level .max=.sh.level-1 9707c2fbfb3SApril Chin while((--.level>=0)) 9717c2fbfb3SApril Chin do 9727c2fbfb3SApril Chin ((.sh.level = .level)) 9737c2fbfb3SApril Chin _Dbg_print_frame "${.level}" "$0" "${.sh.file}" "${.sh.lineno}" "${.sh.command##* }" "$@" 9747c2fbfb3SApril Chin done 9757c2fbfb3SApril Chin} 9767c2fbfb3SApril Chin 9777c2fbfb3SApril Chin((baseline=LINENO+2)) 9787c2fbfb3SApril Chintrap '_Dbg_debug_trap_handler' DEBUG 97934f9b3eeSRoland Mainz. $tmp/debug foo bar 9807c2fbfb3SApril Chintrap '' DEBUG 98134f9b3eeSRoland Mainz 9827c2fbfb3SApril Chincaller() { 9837c2fbfb3SApril Chin integer .level=.sh.level .max=.sh.level-1 9847c2fbfb3SApril Chin while((--.level>=0)) 9857c2fbfb3SApril Chin do 9867c2fbfb3SApril Chin ((.sh.level = .level)) 9877c2fbfb3SApril Chin print -r -- "${.sh.lineno}" 9887c2fbfb3SApril Chin done 9897c2fbfb3SApril Chin} 9907c2fbfb3SApril Chinbar() { caller;} 9917c2fbfb3SApril Chinset -- $(bar) 9927c2fbfb3SApril Chin[[ $1 == $2 ]] && err_exit ".sh.inline optimization bug" 9937c2fbfb3SApril Chin( $SHELL -c ' function foo { typeset x=$1;print $1;};z=();z=($(foo bar)) ') 2> /dev/null || err_exit 'using a function to set an array in a command sub fails' 99434f9b3eeSRoland Mainz 99534f9b3eeSRoland Mainz{ 99634f9b3eeSRoland Mainzgot=$( 99734f9b3eeSRoland Mainzs=$(ulimit -s) 99834f9b3eeSRoland Mainzif [[ $s == +([[:digit:]]) ]] && (( s < 16384 )) 99934f9b3eeSRoland Mainzthen ulimit -s 16384 2>/dev/null 100034f9b3eeSRoland Mainzfi 100134f9b3eeSRoland Mainz$SHELL << \+++ 100234f9b3eeSRoland Mainzf() 100334f9b3eeSRoland Mainz{ 100434f9b3eeSRoland Mainz if (($1>1)) 100534f9b3eeSRoland Mainz then x=$(f $(($1-1))) || exit 1 100634f9b3eeSRoland Mainz fi 100734f9b3eeSRoland Mainz return 0 100834f9b3eeSRoland Mainz} 100934f9b3eeSRoland Mainzf 257 && print ok 101034f9b3eeSRoland Mainz+++ 101134f9b3eeSRoland Mainz) 101234f9b3eeSRoland Mainz} 2>/dev/null 101334f9b3eeSRoland Mainz[[ $got == ok ]] || err_exit 'cannot handle comsub depth > 256 in function' 101434f9b3eeSRoland Mainz 101534f9b3eeSRoland Mainztmp1=$tmp/job.1 101634f9b3eeSRoland Mainztmp2=$tmp/job.2 101734f9b3eeSRoland Mainzcat > $tmp1 << +++ 101834f9b3eeSRoland Mainz#! $SHELL 101934f9b3eeSRoland Mainzprint \$\$ 102034f9b3eeSRoland Mainz+++ 102134f9b3eeSRoland Mainzchmod +x $tmp1 102234f9b3eeSRoland Mainzfunction foo 102334f9b3eeSRoland Mainz{ 102434f9b3eeSRoland Mainz typeset pid 102534f9b3eeSRoland Mainz $tmp1 > $tmp2 & pid=$! 102634f9b3eeSRoland Mainz wait $! 102734f9b3eeSRoland Mainz [[ $(< $tmp2) == $pid ]] || err_exit 'wrong pid for & job in function' 102834f9b3eeSRoland Mainz} 102934f9b3eeSRoland Mainzfoo 103034f9b3eeSRoland Mainz# make sure compiled functions work 103134f9b3eeSRoland Mainz[[ $(tmp=$tmp $SHELL <<- \++++ 103234f9b3eeSRoland Mainz cat > $tmp/functions <<- \EOF 103334f9b3eeSRoland Mainz function bar 103434f9b3eeSRoland Mainz { 103534f9b3eeSRoland Mainz print foo 103634f9b3eeSRoland Mainz } 103734f9b3eeSRoland Mainz function foobar 103834f9b3eeSRoland Mainz { 103934f9b3eeSRoland Mainz bar 104034f9b3eeSRoland Mainz } 104134f9b3eeSRoland Mainz EOF 104234f9b3eeSRoland Mainz ${SHCOMP:-${SHELL%/*}/shcomp} $tmp/functions > $tmp/foobar 104334f9b3eeSRoland Mainz rm -f "$tmp/functions" 104434f9b3eeSRoland Mainz chmod +x $tmp/foobar 104534f9b3eeSRoland Mainz rm $tmp/!(dir|foobar) 104634f9b3eeSRoland Mainz FPATH=$tmp 104734f9b3eeSRoland Mainz PATH=$FPATH:$PATH 104834f9b3eeSRoland Mainz foobar 104934f9b3eeSRoland Mainz++++ 105034f9b3eeSRoland Mainz) == foo ]] > /dev/null || err_exit 'functions compiled with shcomp not working' 1051*b30d1939SAndy Fiddaman# tests for compiled . scripts 1052*b30d1939SAndy Fiddamanprint $'print hello\nprint world' > $tmp/foo 1053*b30d1939SAndy Fiddaman${SHCOMP:-${SHELL%/*}/shcomp} $tmp/foo > $tmp/foo.sh 1054*b30d1939SAndy Fiddamanval=$(. $tmp/foo.sh) 1055*b30d1939SAndy Fiddaman[[ $val == $'hello\nworld' ]] || err_exit "processing compiled dot files not working correctly val=$val" 105634f9b3eeSRoland Mainz# test for functions in shell having side effects. 105734f9b3eeSRoland Mainzunset -f foo foobar bar 105834f9b3eeSRoland Mainzcd "$tmp" 105934f9b3eeSRoland MainzFPATH=$PWD 106034f9b3eeSRoland MainzPATH=$FPATH:$PATH 106134f9b3eeSRoland Mainzcat > foo <<- \EOF 106234f9b3eeSRoland Mainz function bar 106334f9b3eeSRoland Mainz { 106434f9b3eeSRoland Mainz print foobar 106534f9b3eeSRoland Mainz } 106634f9b3eeSRoland Mainz function foo 106734f9b3eeSRoland Mainz { 106834f9b3eeSRoland Mainz bar 106934f9b3eeSRoland Mainz } 107034f9b3eeSRoland MainzEOF 107134f9b3eeSRoland Mainzchmod +x foo 107234f9b3eeSRoland Mainz: $(foo) 107334f9b3eeSRoland Mainz[[ $(typeset +f) == *foo* ]] && err_exit 'function in subshell leaving side effect of function foo' 107434f9b3eeSRoland Mainzunset -f foo bar 107534f9b3eeSRoland Mainz: $(foo) 107634f9b3eeSRoland Mainz[[ $(typeset +f) == *foo* ]] && err_exit 'function in subshell leaving side effects of function foo after reload' 107734f9b3eeSRoland Mainz[[ $(typeset +f) == *bar* ]] && err_exit 'function in subshell leaving side effects of function bar after reload' 107834f9b3eeSRoland Mainz 10793e14f97fSRoger A. Faulknerunset -f foo 10803e14f97fSRoger A. Faulknertypeset -A bar 10813e14f97fSRoger A. Faulknerfunction foo 10823e14f97fSRoger A. Faulkner{ 10833e14f97fSRoger A. Faulkner typeset -i bar[$1].x 10843e14f97fSRoger A. Faulkner bar[$1].x=5 10853e14f97fSRoger A. Faulkner} 10863e14f97fSRoger A. Faulknerfoo sub 10873e14f97fSRoger A. Faulkner[[ ${!bar[@]} == sub ]] || err_exit 'scoping problem with compound array variables' 10883e14f97fSRoger A. Faulkner 10893e14f97fSRoger A. Faulknerfunction A 10903e14f97fSRoger A. Faulkner{ 10913e14f97fSRoger A. Faulkner trap "> /dev/null;print TRAP A" EXIT 10923e14f97fSRoger A. Faulkner # (( stderr )) && print >&2 10933e14f97fSRoger A. Faulkner} 10943e14f97fSRoger A. Faulkner 10953e14f97fSRoger A. Faulknerfunction B 10963e14f97fSRoger A. Faulkner{ 10973e14f97fSRoger A. Faulkner trap "> /dev/null;print TRAP B" EXIT 10983e14f97fSRoger A. Faulkner A 10993e14f97fSRoger A. Faulkner} 11003e14f97fSRoger A. Faulkner 11013e14f97fSRoger A. Faulknerx=$(B) 1102*b30d1939SAndy Fiddaman[[ $x == $'TRAP A\nTRAP B' ]] || err_exit "trap from functions in subshells fails got" $x 11033e14f97fSRoger A. Faulkner 1104*b30d1939SAndy Fiddamanfunction foo 1105*b30d1939SAndy Fiddaman{ 1106*b30d1939SAndy Fiddaman typeset bar=abc 1107*b30d1939SAndy Fiddaman unset bar 1108*b30d1939SAndy Fiddaman# [[ $bar == bam ]] || err_exit 'unsetting local variable does not expose global variable' 1109*b30d1939SAndy Fiddaman [[ $bar ]] && err_exit 'unsetting local variable exposes global variable' 1110*b30d1939SAndy Fiddaman} 1111*b30d1939SAndy Fiddamanbar=bam 1112*b30d1939SAndy Fiddamanfoo 1113*b30d1939SAndy Fiddaman 1114*b30d1939SAndy Fiddamansleep=$(whence -p sleep) 1115*b30d1939SAndy Fiddamanfunction gosleep 1116*b30d1939SAndy Fiddaman{ 1117*b30d1939SAndy Fiddaman $sleep 4 1118*b30d1939SAndy Fiddaman} 1119*b30d1939SAndy Fiddamanx=$( 1120*b30d1939SAndy Fiddaman (sleep 2; pid=; ps | grep sleep | read pid extra; [[ $pid ]] && kill -- $pid) & 1121*b30d1939SAndy Fiddaman gosleep 2> /dev/null 1122*b30d1939SAndy Fiddaman print ok 1123*b30d1939SAndy Fiddaman) 1124*b30d1939SAndy Fiddaman[[ $x == ok ]] || err_exit 'TERM signal sent to last process of function kills the script' 1125*b30d1939SAndy Fiddaman 1126*b30d1939SAndy Fiddaman# verify that $0 does not change with functions defined as fun() 1127*b30d1939SAndy Fiddamanfunc1() 1128*b30d1939SAndy Fiddaman{ 1129*b30d1939SAndy Fiddaman [[ $0 == "$dol0" ]] || err_exit "\$0 changed in func1() to $0" 1130*b30d1939SAndy Fiddaman} 1131*b30d1939SAndy Fiddamanfunction func2 1132*b30d1939SAndy Fiddaman{ 1133*b30d1939SAndy Fiddaman [[ $0 == func2 ]] || err_exit "\$0 changed in func2() to $0" 1134*b30d1939SAndy Fiddaman dol0=func2 1135*b30d1939SAndy Fiddaman func1 1136*b30d1939SAndy Fiddaman} 1137*b30d1939SAndy Fiddamanfunc2 1138*b30d1939SAndy Fiddaman 1139*b30d1939SAndy Fiddaman{ $SHELL <<- \EOF 1140*b30d1939SAndy Fiddaman function foo 1141*b30d1939SAndy Fiddaman { 1142*b30d1939SAndy Fiddaman typeset rc=0 1143*b30d1939SAndy Fiddaman unset -f foo 1144*b30d1939SAndy Fiddaman return $rc; 1145*b30d1939SAndy Fiddaman } 1146*b30d1939SAndy Fiddaman foo 1147*b30d1939SAndy FiddamanEOF 1148*b30d1939SAndy Fiddaman} 2> /dev/null || err_exit 'problem with unset -f foo within function foo' 1149*b30d1939SAndy Fiddaman 1150*b30d1939SAndy Fiddamanval=$($SHELL 2> /dev/null <<- \EOF 1151*b30d1939SAndy Fiddaman .sh.fun.set() { set -x; } 1152*b30d1939SAndy Fiddaman function f1 { print -n ${.sh.fun}; set -o | grep xtrace;} 1153*b30d1939SAndy Fiddaman function f2 { print -n ${.sh.fun}; set -o | grep xtrace;} 1154*b30d1939SAndy Fiddaman f1 1155*b30d1939SAndy Fiddaman set -o | grep xtrace 1156*b30d1939SAndy Fiddaman f2 1157*b30d1939SAndy FiddamanEOF) 1158*b30d1939SAndy Fiddaman[[ $val == f1xtrace*on*off*f2xtrace*on* ]] || err_exit "'.sh.fun.set() { set -x; }' not tracing all functions" 1159*b30d1939SAndy Fiddaman 1160*b30d1939SAndy Fiddamanfunction foo 1161*b30d1939SAndy Fiddaman{ 1162*b30d1939SAndy Fiddaman typeset opt OPTIND=1 OPTARG hflag= 1163*b30d1939SAndy Fiddaman while getopts hi: opt 1164*b30d1939SAndy Fiddaman do case $opt in 1165*b30d1939SAndy Fiddaman h) hflag=1;; 1166*b30d1939SAndy Fiddaman i) [[ $OPTARG == foobar ]] || err_exit 'OPTARG should be set to foobar in function foo';; 1167*b30d1939SAndy Fiddaman esac 1168*b30d1939SAndy Fiddaman done 1169*b30d1939SAndy Fiddaman shift $((OPTIND - 1)) 1170*b30d1939SAndy Fiddaman (( OPTIND == 4 )) || err_exit "OPTIND is $OPTIND at end of function foo; it should be 4" 1171*b30d1939SAndy Fiddaman [[ $1 == foo2 ]] || err_exit "\$1 is $1, not foo after getopts in function" 1172*b30d1939SAndy Fiddaman} 1173*b30d1939SAndy FiddamanOPTIND=6 OPTARG=xxx 1174*b30d1939SAndy Fiddamanfoo -h -i foobar foo2 1175*b30d1939SAndy Fiddaman[[ $OPTARG == xxx ]] || err_exit 'getopts in function changes global OPTARG' 1176*b30d1939SAndy Fiddaman(( OPTIND == 6 )) || err_exit 'getopts in function changes global OPTIND' 1177*b30d1939SAndy Fiddaman 1178*b30d1939SAndy Fiddamanif [[ ! $compiled ]] 1179*b30d1939SAndy Fiddamanthen function foo { getopts --man; } 1180*b30d1939SAndy Fiddaman [[ $(typeset -f foo) == 'function foo { getopts --man; }' ]] || err_exit 'typeset -f not work for function with getopts' 1181*b30d1939SAndy Fiddamanfi 1182*b30d1939SAndy Fiddaman 1183*b30d1939SAndy Fiddamanfunction foo 1184*b30d1939SAndy Fiddaman{ 1185*b30d1939SAndy Fiddaman let 1 1186*b30d1939SAndy Fiddaman return $1 1187*b30d1939SAndy Fiddaman} 1188*b30d1939SAndy Fiddamaninvals=(135 255 256 267 -1) 1189*b30d1939SAndy Fiddamanoutvals=(135 255 0 267 255) 1190*b30d1939SAndy Fiddamanfor ((i=0; i < ${#invals[@]}; i++)) 1191*b30d1939SAndy Fiddamando foo ${invals[i]} 1192*b30d1939SAndy Fiddaman [[ $? == "${outvals[i]}" ]] || err_exit "function exit ${invals[i]} should set \$? to ${outvals[i]}" 1193*b30d1939SAndy Fiddamandone 1194*b30d1939SAndy Fiddaman 1195*b30d1939SAndy Fiddamanfunction foo 1196*b30d1939SAndy Fiddaman{ 1197*b30d1939SAndy Fiddaman typeset pid 1198*b30d1939SAndy Fiddaman sleep 2 & pid=$! 1199*b30d1939SAndy Fiddaman sleep 1 1200*b30d1939SAndy Fiddaman kill -TERM $pid 1201*b30d1939SAndy Fiddaman wait $pid 1202*b30d1939SAndy Fiddaman rc=$? 1203*b30d1939SAndy Fiddaman return $rc 1204*b30d1939SAndy Fiddaman} 1205*b30d1939SAndy Fiddamanfoo 2> /dev/null 1206*b30d1939SAndy Fiddamanrc=$? 1207*b30d1939SAndy Fiddamanexp=$((256+$(kill -l TERM) )) 1208*b30d1939SAndy Fiddaman[[ $rc == "$exp" ]] || err_exit "expected exitval $exp got $rc" 1209*b30d1939SAndy Fiddaman 1210*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125)) 1211