This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[inseparable changes from patch from perl5.003_19 to perl5.003_20]
authorPerl 5 Porters <perl5-porters@africa.nicoh.com>
Tue, 7 Jan 1997 23:52:00 +0000 (11:52 +1200)
committerChip Salzenberg <chip@atlantic.net>
Tue, 7 Jan 1997 23:52:00 +0000 (11:52 +1200)
 BUILD PROCESS

Subject: Make Configure default to the first domain in /etc/resolv.conf
From: Chip Salzenberg <chip@atlantic.net>
Files: Configure

Subject: Start all helper scripts with $startsh
From: Chip Salzenberg <chip@atlantic.net>
Files: Configure

Subject: Support libperl.so under FreeBSD
Date: Sun, 5 Jan 1997 22:41:49 +0100
From: Ollivier Robert <roberto@keltia.freenix.fr>
Files: Configure Makefile.SH
Msg-ID: <Mutt.19970105224149.roberto@keltia.freenix.fr>

    (applied based on p5p patch as commit b126116e5ae3d57fa007f8a42fd506805b35163b)

 CORE LANGUAGE CHANGES

Subject: Rescind named closures
From: Chip Salzenberg <chip@atlantic.net>
Files: Makefile.SH op.c perly.c perly.c.diff perly.y pp_hot.c

Subject: Fix: empty @_ when calling empty-proto subs without parens
Date: Sat, 04 Jan 1997 10:29:04 +0000
From: Graham Barr <bodg@tiuk.ti.com>
Files: perly.c perly.y

    (applied based on p5p patch as commit 3112f5de73952f91aa4e8005d9852dfddbcf0402)

 CORE PORTABILITY

Subject: Configure/perl5/Compartmented Mode Workstation (fwd)
Date: Mon, 06 Jan 1997 13:15:38 -0500 (EST)
From: Andy Dougherty <doughera@fractal.phys.lafayette.edu>
Files: Configure hints/dec_osf.sh

    private-msgid: <Pine.SOL.3.95.970106131505.1662C-100000@fractal.lafayette.ed

Subject: Remove obsolete file "dl_os2.xs".
From: Ilya Zakharevich <ilya@math.ohio-state.edu>
Files: MANIFEST

 DOCUMENTATION

Subject: tiny doc patches
Date: Sat, 04 Jan 1997 11:12:13 -0500
From: Roderick Schertler <roderick@gate.net>
Files: pod/perlapio.pod pod/perlnews.pod pod/perltoc.pod
Msg-ID: <23338.852394333@eeyore.ibcinc.com>

    (applied based on p5p patch as commit b681178584626ba3718f1279845fd452317134c1)

Subject: doc patch for defined on perlfunc.pod
Date: 04 Jan 1997 21:28:30 -0500
From: Roderick Schertler <roderick@gate.net>
Files: pod/perlfunc.pod
Msg-ID: <pz91686ek1.fsf@eeyore.ibcinc.com>

    (applied based on p5p patch as commit 38e3adfd2e3d40b46e465482945c4f3de4bb50ef)

Subject: doc patch: perldsc
Date: 04 Jan 1997 21:25:58 -0500
From: Roderick Schertler <roderick@gate.net>
Files: pod/perldsc.pod pod/perltoc.pod
Msg-ID: <pzafqo6eo9.fsf@eeyore.ibcinc.com>

    (applied based on p5p patch as commit 4d42f92e5bf79556508016b7af91233b12e526eb)

Subject: scalar caller doc fix
Date: Mon, 06 Jan 1997 22:34:20 -0500
From: Roderick Schertler <roderick@gate.net>
Files: pod/perlfunc.pod
Msg-ID: <18245.852608060@eeyore.ibcinc.com>

    (applied based on p5p patch as commit 218104faecb0ec19e0f4f89e084959e757a5230f)

Subject: Misc perlfunc updates
From: Tom Christiansen <tchrist@mox.perl.com>
Files: pod/perlfunc.pod pod/perltoc.pod

 LIBRARY AND EXTENSIONS

Subject: sigaction() problems
Date: Mon, 06 Jan 1997 15:42:04 -0500
From: Roderick Schertler <roderick@gate.net>
Files: ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod
Msg-ID: <12808.852583324@eeyore.ibcinc.com>

    (applied based on p5p patch as commit 84e96f2bcc509ba2fb5d2c9608a30cc3cfdea41a)

Subject: Fix importation of FileHandle methods; fix POSIX docs
From: Chip Salzenberg <chip@atlantic.net>
Files: ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod lib/FileHandle.pm

Subject: Patch: make hints files warn about db-recno failures
Date: Sun, 5 Jan 1997 12:34:25 +0100
From: Dominic Dunlop <domo@slipper.ip.lu>
Files: MANIFEST hints/aux.sh hints/broken-db.msg hints/freebsd.sh

    (applied based on p5p patch as commit 692df45da95e2b7d14c4560347ef4555bb40b621)

 OTHER CORE CHANGES

Subject: Fix C< sub foo (&@); sub bar (&); foo {}, bar {}, bar {} >
From: Chip Salzenberg <chip@atlantic.net>
Files: perly.c perly.c.diff perly.y

Subject: plug for safe/opcode leaks
Date: Tue, 07 Jan 1997 17:20:46 -0500
From: Doug MacEachern <dougm@osf.org>
Files: op.c
Msg-ID: <199701072220.RAA02117@postman.osf.org>

    (applied based on p5p patch as commit 5cbfc2849d37f748a8facbcbf1c889c575943488)

Subject: Fix Dynaloader failures with DProf
Date: Mon, 06 Jan 1997 12:18:46 -0500
From: Gurusamy Sarathy <gsar@engin.umich.edu>
Files: pp_hot.c

    private-msgid: <199701061718.MAA26909@aatma.engin.umich.edu>

 TESTS

Subject: New test: comp/proto.t
Date: Mon, 06 Jan 1997 09:13:03 +0000
From: Graham Barr <bodg@tiuk.ti.com>
Files: MANIFEST t/comp/proto.t

    (applied based on p5p patch as commit 8c1635e65dc1b3900503d444e985e3f0e5601454)

24 files changed:
Changes
Configure
MANIFEST
Makefile.SH
ext/POSIX/POSIX.pm
ext/POSIX/POSIX.pod
hints/aux.sh
hints/broken-db.msg [new file with mode: 0644]
hints/dec_osf.sh
hints/freebsd.sh
lib/FileHandle.pm
op.c
patchlevel.h
perly.c
perly.c.diff
perly.y
pod/buildtoc
pod/perlapio.pod
pod/perldsc.pod
pod/perlfunc.pod
pod/perlnews.pod
pod/perltoc.pod
pp_hot.c
t/comp/proto.t

diff --git a/Changes b/Changes
index 6d49f1c..d75ec7e 100644 (file)
--- a/Changes
+++ b/Changes
@@ -9,6 +9,174 @@ releases.)
 
 
 ----------------
+Version 5.003_20
+----------------
+
+The only language change in this release is the recension of support
+for named closures:  Now, no subroutine declared "sub foo {}" can be
+a closure.  (This is a return to the behavior of 5.003.)  In addition,
+there are new warnings triggered by any apparent attempt to use named
+functions as closures.
+
+And, as usual, there are the usual little fixes, documentation
+updates, and expanded tests.  This is good stuff.  "I love you, man!"
+
+ CORE LANGUAGE CHANGES
+
+  Title:  "Rescind named closures"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  Makefile.SH op.c perly.c perly.c.diff perly.y pp_hot.c
+
+  Title:  "Fix: empty @_ when calling empty-proto subs without parens"
+   From:  Graham Barr <bodg@tiuk.ti.com>
+ Msg-ID:  <32CE30F0.7E8425A5@tiuk.ti.com>
+   Date:  Sat, 04 Jan 1997 10:29:04 +0000
+  Files:  perly.c perly.y
+
+ CORE PORTABILITY
+
+  Title:  "Fix $^X on systems that set it to Perl's basename"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  hints/hpux.sh toke.c
+
+  Title:  "Configure/perl5/Compartmented Mode Workstation (fwd)"
+   From:  Andy Dougherty <doughera@fractal.phys.lafayette.edu>
+ Msg-ID:  <Pine.SOL.3.95.970106131505.1662C-100000@fractal.lafayette.ed
+   Date:  Mon, 06 Jan 1997 13:15:38 -0500 (EST)
+  Files:  Configure hints/dec_osf.sh
+
+  Title:  "Remove obsolete file "dl_os2.xs"."
+   From:  Ilya Zakharevich <ilya@math.ohio-state.edu>
+  Files:  MANIFEST
+
+ OTHER CORE CHANGES
+
+  Title:  "Fix C< sub foo (&@); sub bar (&); foo {}, bar {}, bar {} >"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  perly.c perly.c.diff perly.y
+
+  Title:  "plug for safe/opcode leaks"
+   From:  Doug MacEachern <dougm@osf.org>
+ Msg-ID:  <199701072220.RAA02117@postman.osf.org>
+   Date:  Tue, 07 Jan 1997 17:20:46 -0500
+  Files:  op.c
+
+  Title:  "Finish OP= warnings: none on ^="
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  doop.c pp.c t/op/assignwarn.t
+
+  Title:  "Fix Dynaloader failures with DProf"
+   From:  Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID:  <199701061718.MAA26909@aatma.engin.umich.edu>
+   Date:  Mon, 06 Jan 1997 12:18:46 -0500
+  Files:  pp_hot.c
+
+ BUILD PROCESS
+
+  Title:  "Make Configure default to the first domain in /etc/resolv.conf"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  Configure
+
+  Title:  "Start all helper scripts with $startsh"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  Configure
+
+  Title:  "Support libperl.so under FreeBSD"
+   From:  roberto@keltia.freenix.fr (Ollivier Robert)
+ Msg-ID:  <Mutt.19970105224149.roberto@keltia.freenix.fr>
+   Date:  Sun, 5 Jan 1997 22:41:49 +0100
+  Files:  Configure Makefile.SH
+
+ TESTS
+
+  Title:  "New test: comp/proto.t"
+   From:  Graham Barr <bodg@tiuk.ti.com>
+ Msg-ID:  <32D0C21F.3FB28D51@tiuk.ti.com>
+   Date:  Mon, 06 Jan 1997 09:13:03 +0000
+  Files:  MANIFEST t/comp/proto.t
+
+  Title:  "More magic variable tests"
+   From:  Roderick Schertler <roderick@gate.net>
+ Msg-ID:  <7043.852565192@eeyore.ibcinc.com>
+   Date:  Mon, 06 Jan 1997 10:39:52 -0500
+  Files:  t/harness t/op/magic.t
+
+ LIBRARY AND EXTENSIONS
+
+  Title:  "File::Basename::dirname bugs"
+   From:  Robin Barker <rmb@cise.npl.co.uk>
+ Msg-ID:  <12393.9701071719@tempest.cise.npl.co.uk>
+   Date:  Tue, 7 Jan 97 17:19:59 GMT
+  Files:  lib/File/Basename.pm t/lib/basename.t
+
+  Title:  "sigaction() problems"
+   From:  Roderick Schertler <roderick@gate.net>
+ Msg-ID:  <12808.852583324@eeyore.ibcinc.com>
+   Date:  Mon, 06 Jan 1997 15:42:04 -0500
+  Files:  ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod
+
+  Title:  "Fix importation of FileHandle methods; fix POSIX docs"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod lib/FileHandle.pm
+
+  Title:  "Patch: make hints files warn about db-recno failures"
+   From:  Dominic Dunlop <domo@slipper.ip.lu>
+ Msg-ID:  <v03010d00aef53ac4d18a@[194.51.248.68]>
+   Date:  Sun, 5 Jan 1997 12:34:25 +0100
+  Files:  MANIFEST hints/aux.sh hints/broken-db.msg hints/freebsd.sh
+
+ UTILITIES
+
+  Title:  "pod2html.PL patch (for 5.003-19)"
+   From:  Fabien TASSIN <tassin@eerie.fr>
+ Msg-ID:  <199701052347.AAA21297@solar5>
+   Date:  Mon, 6 Jan 1997 00:47:01 +0100
+  Files:  pod/pod2html.PL
+
+ DOCUMENTATION
+
+  Title:  "tiny doc patches"
+   From:  Roderick Schertler <roderick@gate.net>
+ Msg-ID:  <23338.852394333@eeyore.ibcinc.com>
+   Date:  Sat, 04 Jan 1997 11:12:13 -0500
+  Files:  pod/perlapio.pod pod/perlnews.pod pod/perltoc.pod
+
+  Title:  "doc patch for defined on perlfunc.pod"
+   From:  Roderick Schertler <roderick@gate.net>
+ Msg-ID:  <pz91686ek1.fsf@eeyore.ibcinc.com>
+   Date:  04 Jan 1997 21:28:30 -0500
+  Files:  pod/perlfunc.pod
+
+  Title:  "doc patch: perldsc"
+   From:  Roderick Schertler <roderick@gate.net>
+ Msg-ID:  <pzafqo6eo9.fsf@eeyore.ibcinc.com>
+   Date:  04 Jan 1997 21:25:58 -0500
+  Files:  pod/perldsc.pod pod/perltoc.pod
+
+  Title:  "Re: constant function inlining"
+   From:  Roderick Schertler <roderick@gate.net>
+ Msg-ID:  <pzk9pp1b95.fsf@eeyore.ibcinc.com>
+   Date:  07 Jan 1997 15:27:50 -0500
+  Files:  pod/perldiag.pod pod/perlsub.pod
+
+  Title:  "scalar caller doc fix"
+   From:  Roderick Schertler <roderick@gate.net>
+ Msg-ID:  <18245.852608060@eeyore.ibcinc.com>
+   Date:  Mon, 06 Jan 1997 22:34:20 -0500
+  Files:  pod/perlfunc.pod
+
+  Title:  "perlpod.pod possible patches"
+   From:  lvirden@cas.org (Larry W. Virden, x2487)
+ Msg-ID:  <9701070756.AA1185@cas.org>
+   Date:  Tue, 7 Jan 1997 07:56:30 -0500
+  Files:  pod/perlpod.pod
+
+  Title:  "Misc perlfunc updates"
+   From:  Tom Christiansen <tchrist@mox.perl.com>
+  Files:  pod/perlfunc.pod pod/perltoc.pod
+
+
+----------------
 Version 5.003_19
 ----------------
 
index 464e54c..9211439 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -958,7 +958,11 @@ silent=''
 extractsh=''
 override=''
 knowitall=''
+
 rm -f optdef.sh
+cat >optdef.sh <<EOS
+$startsh
+EOS
 
 : option parsing
 while test $# -gt 0; do
@@ -1192,6 +1196,7 @@ esac"
 
 : now set up to do reads with possible shell escape and default assignment
 cat <<EOSC >myread
+$startsh
 xxxm=\$dflt
 $myecho
 ans='!'
@@ -1770,7 +1775,7 @@ EOM
                ultrix) osname=ultrix
                        osvers="$3"
                        ;;
-               osf1)   case "$5" in
+               osf1|mls+)      case "$5" in
                                alpha)
                                        osname=dec_osf
                                        osvers=`echo "$3" | sed 's/^[vt]//'`
@@ -2117,7 +2122,10 @@ chmod +x filexp
 $eunicefix filexp
 
 : now set up to get a file name
-cat <<'EOSC' >getfile
+cat <<EOS >getfile
+$startsh
+EOS
+cat <<'EOSC' >>getfile
 tilde=''
 fullpath=''
 already=''
@@ -2516,7 +2524,10 @@ else
 fi
 
 : set up the script used to warn in case of inconsistency
-cat <<'EOSC' >whoa
+cat <<EOS >whoa
+$startsh
+EOS
+cat <<'EOSC' >>whoa
 dflt=y
 echo " "
 echo "*** WHOA THERE!!! ***" >&4
@@ -4679,6 +4690,9 @@ if "$useshrplib"; then
        solaris|netbsd)
                xxx="-R $shrpdir"
                ;;
+       freebsd)
+               xxx="-Wl,-R,$shrpdir"
+               ;;
        linux|irix*)
                xxx="-Wl,-rpath,$shrpdir"
                ;;
@@ -5134,11 +5148,11 @@ case "$myhostname" in
                                : Why was there an Egrep here, when Sed works?
                                : Look for either a search or a domain directive.
                                dflt=.`$sed -n -e 's/   / /g' \
-                                 -e 's/^search.* \([^ ]*\) *$/\1/p' $tans \
+                                 -e 's/^search  *\([^ ]*\).*/\1/p' $tans \
                                  | ./tr '[A-Z]' '[a-z]' 2>/dev/null`
                                case "$dflt" in
                                .) dflt=.`$sed -n -e 's/        / /g' \
-                                    -e 's/^domain.* \([^ ]*\) *$/\1/p' $tans \
+                                    -e 's/^domain  *\([^ ]*\).*/\1/p' $tans \
                                     | ./tr '[A-Z]' '[a-z]' 2>/dev/null`
                                        ;;
                                esac
@@ -6400,7 +6414,9 @@ main()
 }
 EOCP
        if $cc $ccflags $ldflags try.c -o try >/dev/null 2>&1; then
-               echo "$startsh" >mtry
+               cat <<EOS >mtry
+$startsh
+EOS
                echo "./try >try.out 2>try.ret 3>try.err || exit 4" >>mtry
                chmod +x mtry
                ./mtry >/dev/null 2>&1
@@ -6436,7 +6452,7 @@ EOCP
                *) echo "However, your read() returns '$status' on EOF??";;
                esac
                val="$define"
-               if test "$status" -eq "$rd_nodata"; then
+               if test "$status" = "$rd_nodata"; then
                        echo "WARNING: you can't distinguish between EOF and no data!"
                        val="$undef"
                fi
index 4d840b5..ac32354 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -95,7 +95,6 @@ ext/DynaLoader/dl_dlopen.xs   BSD/SunOS4&5 dlopen() style implementation
 ext/DynaLoader/dl_hpux.xs      HP-UX implementation
 ext/DynaLoader/dl_next.xs      Next implementation
 ext/DynaLoader/dl_none.xs      Stub implementation
-ext/DynaLoader/dl_os2.xs       OS/2 implementation
 ext/DynaLoader/dl_vms.xs       VMS implementation
 ext/DynaLoader/dlutils.c       Dynamic loader utilities for dl_*.xs files
 ext/Fcntl/Fcntl.pm             Fcntl extension Perl module
@@ -205,6 +204,7 @@ hints/altos486.sh   Hints for named architecture
 hints/amigaos.sh       Hints for named architecture
 hints/apollo.sh                Hints for named architecture
 hints/aux.sh           Hints for named architecture
+hints/broken-db.msg    Warning message for systems with broken DB library
 hints/bsdos.sh         Hints for named architecture
 hints/convexos.sh      Hints for named architecture
 hints/cxux.sh          Hints for named architecture
@@ -565,6 +565,7 @@ t/comp/cpp.t                See if C preprocessor works
 t/comp/decl.t          See if declarations work
 t/comp/multiline.t     See if multiline strings work
 t/comp/package.t       See if packages work
+t/comp/proto.t         See if function prototypes work
 t/comp/redef.t         See if we get correct warnings on redefined subs
 t/comp/script.t                See if script invokation works
 t/comp/term.t          See if more terms work
@@ -696,7 +697,7 @@ t/pragma/strict-subs        Tests of "use strict 'subs'" for strict.t
 t/pragma/strict-vars   Tests of "use strict 'vars'" for strict.t
 t/pragma/strict.t      See if strictures work
 t/pragma/subs.t                See if subroutine pseudo-importation works
-t/pragma/warn-global   Tests of global warnings for warning.t
+t/pragma/warn-1global  Tests of global warnings for warning.t
 t/pragma/warning.t     See if warning controls work
 taint.c                        Tainting code
 toke.c                 The tokener
index 57acde5..0cce725 100755 (executable)
@@ -34,7 +34,7 @@ true)
                -compatibility_version 1 -current_version $(PATCHLEVEL) \
                -prebind -seg1addr 0x27000000 -install_name $(SHRPDIR)/$@'
                ;;
-       sunos*)
+       sunos*|freebsd[23]*)
                linklibperl="-lperl"
                ;;
        esac
@@ -290,7 +290,7 @@ quantperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
 # has been invoked correctly.
 
 suidperl: $& sperl$(OBJ_EXT) perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-       $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o suidperl perlmain$(OBJ_EXT) sperl$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs)
+       $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o suidperl perlmain$(OBJ_EXT) sperl$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
 
 !NO!SUBS!
 
@@ -344,7 +344,7 @@ install.man:        all installman
 # normally shouldn't remake perly.[ch].
 
 run_byacc:     FORCE
-       @ echo 'Expect' 130 shift/reduce and 1 reduce/reduce conflict
+       @ echo 'Expect' 113 shift/reduce and 1 reduce/reduce conflict
        $(BYACC) -d perly.y
        sh $(shellflags) ./perly.fixer y.tab.c perly.c
        sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \
index 22eed02..31ee642 100644 (file)
@@ -231,7 +231,7 @@ sub unimpl {
 package POSIX::SigAction;
 
 sub new {
-    bless {HANDLER => $_[1], MASK => $_[2], FLAGS => $_[3]};
+    bless {HANDLER => $_[1], MASK => $_[2], FLAGS => $_[3] || 0}, $_[0];
 }
 
 ############################
@@ -385,35 +385,35 @@ sub offsetof {
 }
 
 sub clearerr {
-    redef "FileHandle::clearerr()";
+    redef "IO::Handle::clearerr()";
 }
 
 sub fclose {
-    redef "FileHandle::close()";
+    redef "IO::Handle::close()";
 }
 
 sub fdopen {
-    redef "FileHandle::new_from_fd()";
+    redef "IO::Handle::new_from_fd()";
 }
 
 sub feof {
-    redef "FileHandle::eof()";
+    redef "IO::Handle::eof()";
 }
 
 sub fgetc {
-    redef "FileHandle::getc()";
+    redef "IO::Handle::getc()";
 }
 
 sub fgets {
-    redef "FileHandle::gets()";
+    redef "IO::Handle::gets()";
 }
 
 sub fileno {
-    redef "FileHandle::fileno()";
+    redef "IO::Handle::fileno()";
 }
 
 sub fopen {
-    redef "FileHandle::open()";
+    redef "IO::File::open()";
 }
 
 sub fprintf {
@@ -441,27 +441,27 @@ sub fscanf {
 }
 
 sub fseek {
-    redef "FileHandle::seek()";
+    redef "IO::Seekable::seek()";
 }
 
 sub ferror {
-    redef "FileHandle::error()";
+    redef "IO::Handle::error()";
 }
 
 sub fflush {
-    redef "FileHandle::flush()";
+    redef "IO::Handle::flush()";
 }
 
 sub fgetpos {
-    redef "FileHandle::getpos()";
+    redef "IO::Seekable::getpos()";
 }
 
 sub fsetpos {
-    redef "FileHandle::setpos()";
+    redef "IO::Seekable::setpos()";
 }
 
 sub ftell {
-    redef "FileHandle::tell()";
+    redef "IO::Seekable::tell()";
 }
 
 sub fwrite {
@@ -534,11 +534,11 @@ sub sscanf {
 }
 
 sub tmpfile {
-    redef "FileHandle::new_tmpfile()";
+    redef "IO::File::new_tmpfile()";
 }
 
 sub ungetc {
-    redef "FileHandle::ungetc()";
+    redef "IO::Handle::ungetc()";
 }
 
 sub vfprintf {
index 2bb8743..34597d1 100644 (file)
@@ -155,7 +155,7 @@ This is identical to Perl's builtin C<chown()> function.
 
 =item clearerr
 
-Use method C<FileHandle::clearerr()> instead.
+Use method C<IO::Handle::clearerr()> instead.
 
 =item clock
 
@@ -277,7 +277,7 @@ This is identical to Perl's builtin C<abs()> function.
 
 =item fclose
 
-Use method C<FileHandle::close()> instead.
+Use method C<IO::Handle::close()> instead.
 
 =item fcntl
 
@@ -285,35 +285,35 @@ This is identical to Perl's builtin C<fcntl()> function.
 
 =item fdopen
 
-Use method C<FileHandle::new_from_fd()> instead.
+Use method C<IO::Handle::new_from_fd()> instead.
 
 =item feof
 
-Use method C<FileHandle::eof()> instead.
+Use method C<IO::Handle::eof()> instead.
 
 =item ferror
 
-Use method C<FileHandle::error()> instead.
+Use method C<IO::Handle::error()> instead.
 
 =item fflush
 
-Use method C<FileHandle::flush()> instead.
+Use method C<IO::Handle::flush()> instead.
 
 =item fgetc
 
-Use method C<FileHandle::getc()> instead.
+Use method C<IO::Handle::getc()> instead.
 
 =item fgetpos
 
-Use method C<FileHandle::getpos()> instead.
+Use method C<IO::Seekable::getpos()> instead.
 
 =item fgets
 
-Use method C<FileHandle::gets()> instead.
+Use method C<IO::Handle::gets()> instead.
 
 =item fileno
 
-Use method C<FileHandle::fileno()> instead.
+Use method C<IO::Handle::fileno()> instead.
 
 =item floor
 
@@ -325,7 +325,7 @@ This is identical to the C function C<fmod()>.
 
 =item fopen
 
-Use method C<FileHandle::open()> instead.
+Use method C<IO::File::open()> instead.
 
 =item fork
 
@@ -380,11 +380,11 @@ fscanf() is C-specific--use <> and regular expressions instead.
 
 =item fseek
 
-Use method C<FileHandle::seek()> instead.
+Use method C<IO::Seekable::seek()> instead.
 
 =item fsetpos
 
-Use method C<FileHandle::setpos()> instead.
+Use method C<IO::Seekable::setpos()> instead.
 
 =item fstat
 
@@ -397,7 +397,7 @@ Perl's builtin C<stat> function.
 
 =item ftell
 
-Use method C<FileHandle::tell()> instead.
+Use method C<IO::Seekable::tell()> instead.
 
 =item fwrite
 
@@ -1204,7 +1204,7 @@ seconds.
 
 =item tmpfile
 
-Use method C<FileHandle::new_tmpfile()> instead.
+Use method C<IO::File::new_tmpfile()> instead.
 
 =item tmpnam
 
@@ -1247,7 +1247,7 @@ Get name of current operating system.
 
 =item ungetc
 
-Use method C<FileHandle::ungetc()> instead.
+Use method C<IO::Handle::ungetc()> instead.
 
 =item unlink
 
@@ -1314,9 +1314,10 @@ Creates a new C<POSIX::SigAction> object which corresponds to the C
 C<struct sigaction>.  This object will be destroyed automatically when it is
 no longer needed.  The first parameter is the fully-qualified name of a sub
 which is a signal-handler.  The second parameter is a C<POSIX::SigSet>
-object.  The third parameter contains the C<sa_flags>.
+object, it defaults to the empty set.  The third parameter contains the
+C<sa_flags>, it defaults to 0.
 
-       $sigset = POSIX::SigSet->new;
+       $sigset = POSIX::SigSet->new(SIGINT, SIGQUIT);
        $sigaction = POSIX::SigAction->new( 'main::handler', $sigset, &POSIX::SA_NOCLDSTOP );
 
 This C<POSIX::SigAction> object should be used with the C<POSIX::sigaction()>
index e0aec23..9eccf4a 100644 (file)
@@ -2,8 +2,9 @@
 #
 # Improved by Jake Hamby <jehamby@lightside.com> to support both Apple CC
 # and GNU CC.  Tested on A/UX 3.1.1 with GCC 2.6.3.
+# Now notifies of problem with version of dbm shipped with A/UX
 # Last modified 
-# Fri May  5 10:59:43 EDT 1995
+# Sun Jan  5 11:16:41 WET 1997
 
 case "$cc" in
 *gcc*) optimize='-O2'
@@ -18,3 +19,4 @@ case "$cc" in
        echo "./Configure -Dcc=gcc"
        ;;
 esac
+test -r ./broken-db.msg && . ./broken-db.msg
diff --git a/hints/broken-db.msg b/hints/broken-db.msg
new file mode 100644 (file)
index 0000000..92ba077
--- /dev/null
@@ -0,0 +1,14 @@
+# Several OSs come with an old version of the DB library which fails
+# on a few of the db-recno.t tests.  This file is sourced by the hints
+# files for those OSs.
+
+cat <<EOF >&4
+
+Unless you've upgraded your DB library manually you will see failures in
+db-recno tests 51, 53 and 55.  The behavior these tests are checking is
+broken in the DB library which is included with the OS.  You can ignore
+the errors if you're never going to use the broken functionality (recno
+databases with a modified bval), otherwise you'll have to upgrade your
+DB library or OS.
+
+EOF
index bfd235f..a85abff 100644 (file)
@@ -7,5 +7,12 @@ case "$optimize" in
     esac
     ;;
 esac
+
 ccflags="$ccflags -DSTANDARD_C"
-lddlflags='-shared -expect_unresolved "*" -s -hidden'
+
+# Check if it's a CMW version of OSF1
+if test `uname -s` = "MLS+"; then
+    lddlflags='-shared -expect_unresolved "*" -s'
+else
+    lddlflags='-shared -expect_unresolved "*" -s -hidden'
+fi
index 99ceaa3..4d2ba22 100644 (file)
@@ -64,16 +64,7 @@ case "$osvers" in
        d_setreuid='define'
        d_setegid='undef'
        d_seteuid='undef'
-       cat <<EOF
-
-Unless you've upgraded your DB library manually you will see failures in
-db-recno tests 51, 53 and 55.  The behavior these tests are checking is
-broken in the DB library which is included with the OS.  You can ignore
-the errors if you're never going to use the broken functionality (recno
-databases with a modified bval), otherwise you'll have to upgrade your
-DB library or OS.
-
-EOF
+       test -r ./broken-db.msg && . ./broken-db.msg
        ;;
 #
 # 2.2 and above have phkmalloc(3).
index aa8282b..b907cae 100644 (file)
@@ -44,15 +44,22 @@ import IO::Handle grep { !defined(&$_) } @EXPORT, @EXPORT_OK;
 #
 {
     no strict 'refs';
-    for my $f (qw(DESTROY new_from_fd fdopen close fileno getc ungetc gets eof
-                 setbuf setvbuf _open_mode_string)) {
-       *{$f} = \&{"IO::Handle::$f"} or die "$f missing";
-    }
-    for my $f (qw(seek tell fgetpos fsetpos fflush ferror clearerr)) {
-       *{$f} = \&{"IO::Seekable::$f"} or die "$f missing";
-    }
-    for my $f (qw(new new_tmpfile open)) {
-       *{$f} = \&{"IO::File::$f"} or die "$f missing";
+
+    my %import = (
+       'IO::Handle' =>
+           [qw(DESTROY new_from_fd fdopen close fileno getc ungetc gets
+               eof flush error clearerr setbuf setvbuf _open_mode_string)],
+       'IO::Seekable' =>
+           [qw(seek tell getpos setpos)],
+       'IO::File' =>
+           [qw(new new_tmpfile open)]
+    );
+    for my $pkg (keys %import) {
+       for my $func (@{$import{$pkg}}) {
+           my $c = *{"${pkg}::$func"}{CODE}
+               or die "${pkg}::$func missing";
+           *$func = $c;
+       }
     }
 }
 
diff --git a/op.c b/op.c
index 327ea8a..3e3df86 100644 (file)
--- a/op.c
+++ b/op.c
  * think the expression is of the right type: croak actually does a Siglongjmp.
  */
 #define CHECKOP(type,op) \
-    ((op_mask && op_mask[type]) \
-     ? (croak("%s trapped by operation mask", op_desc[type]), (OP*)op) \
+    ((op_mask && op_mask[type])                                        \
+     ? ( op_free((OP*)op),                                     \
+        croak("%s trapped by operation mask", op_desc[type]),  \
+        Nullop )                                               \
      : (*check[type])((OP*)op))
 #else
 #define CHECKOP(type,op) (*check[type])(op)
@@ -210,14 +212,28 @@ pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix)
                    SvNVX(sv) = (double)curcop->cop_seq;
                    SvIVX(sv) = 999999999;      /* A ref, intro immediately */
                    SvFLAGS(sv) |= SVf_FAKE;
-                   /* "It's closures all the way down." */
-                   CvCLONE_on(compcv);
-                   if (cv != startcv) {
-                       CV *bcv;
-                       for (bcv = startcv;
-                            bcv && bcv != cv && !CvCLONE(bcv);
-                            bcv = CvOUTSIDE(bcv))
-                           CvCLONE_on(bcv);
+                   if (CvANON(compcv)) {
+                       /* "It's closures all the way down." */
+                       CvCLONE_on(compcv);
+                       if (cv != startcv) {
+                           CV *bcv;
+                           for (bcv = startcv;
+                                bcv && bcv != cv && !CvCLONE(bcv);
+                                bcv = CvOUTSIDE(bcv)) {
+                               if (CvANON(bcv))
+                                   CvCLONE_on(bcv);
+                               else {
+                                   if (dowarn)
+                                       warn("Value of %s may be unavailable",
+                                            name);
+                                   break;
+                               }
+                           }
+                       }
+                   }
+                   else {
+                       if (dowarn && !CvUNIQUE(cv))
+                           warn("Value of %s will not stay shared", name);
                    }
                }
                av_store(comppad, newoff, SvREFCNT_inc(oldsv));
@@ -3006,7 +3022,6 @@ OP *block;
     char *name = op ? SvPVx(cSVOP->op_sv, na) : "__ANON__";
     GV* gv = gv_fetchpv(name, GV_ADDMULTI, SVt_PVCV);
     AV* av;
-    char *s;
     I32 ix;
 
     if (op) {
@@ -3020,8 +3035,9 @@ OP *block;
            cv = 0;
        }
        else if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
-           SV* const_sv = cv_const_sv(cv);
+           /* already defined (or promised) */
 
+           SV* const_sv = cv_const_sv(cv);
            char *p = proto ? SvPVx(((SVOP*)proto)->op_sv, na) : Nullch;
 
            if((!proto != !SvPOK(cv)) || (p && strNE(SvPV((SV*)cv,na), p))) {
@@ -3029,8 +3045,7 @@ OP *block;
                        SvPOK(cv) ? SvPV((SV*)cv,na) : "none",
                        p ? p : "none");
            }
-
-           if ((const_sv || dowarn) && strNE(name, "BEGIN")) {/* already defined (or promised)? */
+           if ((const_sv || dowarn) && strNE(name, "BEGIN")) {
                line_t oldline = curcop->cop_line;
 
                curcop->cop_line = copline;
@@ -3079,10 +3094,6 @@ OP *block;
        return cv;
     }
 
-    /* XXX: Named functions at file scope cannot be closures */
-    if (op && CvUNIQUE(CvOUTSIDE(cv)))
-       CvCLONE_off(cv);
-
     av = newAV();                      /* Will be @_ */
     av_extend(av, 0);
     av_store(comppad, 0, (SV*)av);
@@ -3101,34 +3112,37 @@ OP *block;
     CvROOT(cv)->op_next = 0;
     peep(CvSTART(cv));
 
-    if (s = strrchr(name,':'))
-       s++;
-    else
-       s = name;
-    if (strEQ(s, "BEGIN") && !error_count) {
-       ENTER;
-       SAVESPTR(compiling.cop_filegv);
-       SAVEI16(compiling.cop_line);
-       SAVEI32(perldb);
-       save_svref(&rs);
-       sv_setsv(rs, nrs);
-
-       if (!beginav)
-           beginav = newAV();
-       DEBUG_x( dump_sub(gv) );
-       av_push(beginav, (SV *)cv);
-       GvCV(gv) = 0;
-       calllist(beginav);
+    if (op) {
+       char *s = strrchr(name,':');
+       if (s)
+           s++;
+       else
+           s = name;
+       if (strEQ(s, "BEGIN") && !error_count) {
+           ENTER;
+           SAVESPTR(compiling.cop_filegv);
+           SAVEI16(compiling.cop_line);
+           SAVEI32(perldb);
+           save_svref(&rs);
+           sv_setsv(rs, nrs);
+
+           if (!beginav)
+               beginav = newAV();
+           DEBUG_x( dump_sub(gv) );
+           av_push(beginav, (SV *)cv);
+           GvCV(gv) = 0;
+           calllist(beginav);
 
-       curcop = &compiling;
-       LEAVE;
-    }
-    else if (strEQ(s, "END") && !error_count) {
-       if (!endav)
-           endav = newAV();
-       av_unshift(endav, 1);
-       av_store(endav, 0, (SV *)cv);
-       GvCV(gv) = 0;
+           curcop = &compiling;
+           LEAVE;
+       }
+       else if (strEQ(s, "END") && !error_count) {
+           if (!endav)
+               endav = newAV();
+           av_unshift(endav, 1);
+           av_store(endav, 0, (SV *)cv);
+           GvCV(gv) = 0;
+       }
     }
 
     if (perldb && curstash != debstash) {
@@ -3159,10 +3173,9 @@ OP *block;
        }
     }
 
-    if (!op) {
+    if (!op)
        GvCV(gv) = 0;   /* Will remember in SVOP instead. */
-       CvANON_on(cv);
-    }
+
     copline = NOLINE;
     LEAVE_SCOPE(floor);
     return cv;
@@ -3191,7 +3204,6 @@ char *filename;
 {
     register CV *cv;
     GV *gv = gv_fetchpv((name ? name : "__ANON__"), GV_ADDMULTI, SVt_PVCV);
-    char *s;
 
     if (name)
        sub_generation++;
@@ -3223,24 +3235,25 @@ char *filename;
     GvCVGEN(gv) = 0;
     CvFILEGV(cv) = gv_fetchfile(filename);
     CvXSUB(cv) = subaddr;
-    if (!name)
-       s = "__ANON__";
-    else if (s = strrchr(name,':'))
-       s++;
-    else
-       s = name;
-    if (strEQ(s, "BEGIN")) {
-       if (!beginav)
-           beginav = newAV();
-       av_push(beginav, SvREFCNT_inc(gv));
-    }
-    else if (strEQ(s, "END")) {
-       if (!endav)
-           endav = newAV();
-       av_unshift(endav, 1);
-       av_store(endav, 0, SvREFCNT_inc(gv));
-    }
-    if (!name) {
+    if (name) {
+       char *s = strrchr(name,':');
+       if (s)
+           s++;
+       else
+           s = name;
+       if (strEQ(s, "BEGIN")) {
+           if (!beginav)
+               beginav = newAV();
+           av_push(beginav, SvREFCNT_inc(gv));
+       }
+       else if (strEQ(s, "END")) {
+           if (!endav)
+               endav = newAV();
+           av_unshift(endav, 1);
+           av_store(endav, 0, SvREFCNT_inc(gv));
+       }
+    }
+    else {
        GvCV(gv) = 0;   /* Will remember elsewhere instead. */
        CvANON_on(cv);
     }
index 9e19359..ae441d5 100644 (file)
@@ -1,5 +1,5 @@
 #define PATCHLEVEL 3
-#define SUBVERSION 19
+#define SUBVERSION 20
 
 /*
        local_patches -- list of locally applied less-than-subversion patches.
diff --git a/perly.c b/perly.c
index 6ff2f58..3386047 100644 (file)
--- a/perly.c
+++ b/perly.c
@@ -15,23 +15,24 @@ dep()
 #line 16 "perly.c"
 #define YYERRCODE 256
 short yylhs[] = {                                        -1,
-   40,    0,    7,    5,    8,    6,    9,    9,    9,   10,
-   10,   10,   10,   22,   22,   22,   22,   22,   22,   13,
-   13,   13,   12,   12,   37,   37,   11,   11,   11,   11,
-   11,   11,   11,   24,   24,   25,   25,   26,   27,   28,
-   29,   30,   39,   39,    1,    1,    1,    1,    3,    3,
-   41,   41,   36,   36,    4,   42,   42,   43,   14,   14,
-   14,   23,   23,   23,   34,   34,   34,   34,   34,   34,
-   34,   34,   35,   35,   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,
-   15,   15,   15,   15,   15,   15,   15,   15,   31,   31,
-   32,   32,   32,    2,    2,   38,   21,   16,   17,   18,
-   19,   20,   33,   33,   33,   33,
+   43,    0,    8,    6,    9,    7,   10,   10,   10,   11,
+   11,   11,   11,   23,   23,   23,   23,   23,   23,   14,
+   14,   14,   13,   13,   40,   40,   12,   12,   12,   12,
+   12,   12,   12,   25,   25,   26,   26,   27,   28,   29,
+   30,   31,   42,   42,    1,    1,    1,    1,    3,    3,
+   44,    4,    5,   37,   38,   38,   39,   39,   45,   45,
+   47,   46,   15,   15,   15,   24,   24,   24,   35,   35,
+   35,   35,   35,   35,   35,   48,   35,   36,   36,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   32,   32,   33,   33,   33,    2,    2,
+   41,   22,   17,   18,   19,   20,   21,   34,   34,   34,
+   34,
 };
 short yylen[] = {                                         2,
     0,    2,    4,    0,    4,    0,    0,    2,    2,    2,
@@ -39,913 +40,887 @@ short yylen[] = {                                         2,
     2,    6,    7,    7,    0,    2,    8,    8,   10,    9,
     8,   11,    3,    0,    1,    0,    1,    1,    1,    1,
     1,    1,    0,    1,    1,    1,    1,    1,    4,    3,
-    5,    5,    0,    1,    0,    3,    2,    6,    3,    3,
-    1,    2,    3,    1,    3,    5,    6,    3,    5,    2,
-    4,    4,    1,    1,    3,    3,    3,    3,    3,    3,
-    3,    3,    3,    3,    3,    3,    5,    3,    2,    2,
-    2,    2,    2,    2,    2,    2,    2,    2,    3,    2,
-    3,    2,    4,    3,    4,    1,    5,    1,    4,    5,
-    4,    1,    1,    1,    5,    6,    5,    6,    5,    4,
-    5,    1,    1,    3,    4,    3,    2,    2,    4,    5,
-    4,    5,    1,    2,    2,    1,    2,    2,    2,    1,
-    3,    1,    3,    4,    4,    6,    1,    1,    0,    1,
-    0,    1,    2,    1,    1,    1,    2,    2,    2,    2,
-    2,    2,    1,    1,    1,    1,
+    5,    0,    0,    1,    0,    1,    1,    1,    3,    2,
+    0,    7,    3,    3,    1,    2,    3,    1,    3,    5,
+    6,    3,    5,    2,    4,    0,    5,    1,    1,    3,
+    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+    3,    5,    3,    2,    2,    2,    2,    2,    2,    2,
+    2,    2,    2,    3,    2,    3,    2,    4,    3,    4,
+    1,    5,    1,    4,    5,    4,    1,    1,    1,    5,
+    6,    5,    6,    5,    4,    5,    1,    1,    3,    4,
+    3,    2,    2,    4,    5,    4,    5,    1,    2,    2,
+    1,    2,    2,    2,    1,    3,    1,    3,    4,    4,
+    6,    1,    1,    0,    1,    0,    1,    2,    1,    1,
+    1,    2,    2,    2,    2,    2,    2,    1,    1,    1,
+    1,
 };
 short yydefred[] = {                                      1,
-    0,    7,    0,   44,   55,   55,    0,   55,    8,   45,
-    9,   11,    0,   46,   47,   48,    0,    0,    0,   57,
-    0,   14,    4,  147,    0,    0,  122,    0,  142,    0,
-   55,   55,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  154,  155,    0,
+    0,    7,    0,   44,   52,   52,    0,   52,    8,   45,
+    9,   11,    0,   46,   47,   48,    0,    0,    0,   60,
+   61,   14,    4,  152,    0,    0,  127,    0,  147,    0,
+   53,   53,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  159,  160,    0,
     0,    0,    0,    0,    0,    0,    0,   12,    0,    0,
     0,    0,    0,    0,    0,    0,    0,   10,    0,    0,
-    0,    0,  112,  114,    0,    0,    0,    0,  148,    0,
-   50,    0,   56,    0,    7,  163,  166,  165,  164,    0,
-    0,    0,    0,    0,    0,    4,    4,    4,    4,    4,
-    4,    0,    0,    0,    0,    0,  137,    0,    0,    0,
-    0,   70,    0,  161,    0,  128,    0,    0,    0,    0,
-    0,  157,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  102,    0,  158,  159,  160,  162,    0,    0,
-   33,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  117,  119,    0,    0,    0,    0,  153,    0,
+   50,   54,    0,   59,    0,    7,  168,  171,  170,  169,
+    0,    0,    0,    0,    0,    0,    4,    4,    4,    4,
+    4,    4,    0,    0,    0,    0,    0,  142,    0,    0,
+    0,    0,   74,    0,  166,    0,  133,    0,    0,    0,
+    0,    0,  162,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  107,    0,  163,  164,  165,  167,    0,
+    0,   33,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   94,   95,    0,    0,    0,    0,    0,    0,
-    0,    0,   13,    0,   49,   54,    0,    0,    0,   68,
+    0,    0,    0,   99,  100,    0,    0,    0,    0,    0,
+    0,    0,    0,   13,    0,   49,   56,    0,    0,    0,
+   72,    0,    0,   76,    0,    0,    0,    0,    0,    0,
+    0,    4,  146,  148,    0,    0,    0,    0,    0,    0,
+    0,  109,    0,  131,    0,    0,  106,   26,    0,    0,
+   19,    0,    0,    0,   63,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    4,  141,  143,    0,    0,    0,    0,    0,    0,    0,
-  104,    0,  126,    0,    0,  101,   26,    0,    0,   19,
-    0,    0,    0,   59,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   73,    0,   74,    0,    0,    0,    0,    0,    0,    0,
-  124,    0,    0,   52,   51,    0,    3,    0,  145,    0,
-   72,  105,    0,   41,    0,   42,    0,    0,    0,    0,
-  156,    0,    0,   35,   40,    0,    0,    0,  144,  153,
-   71,    0,  129,    0,  131,    0,  103,    0,    0,    0,
-    0,    0,    0,    0,  111,    0,  109,    0,  120,    0,
-  125,   58,   69,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   66,  130,  132,  119,    0,  117,    0,    0,
-  110,    0,  115,  121,  107,  146,    6,    0,    0,    0,
-    0,    0,    0,    0,    0,  118,  116,   67,    7,   27,
-   28,    0,    0,   23,   24,    0,   31,    0,    0,    0,
-   21,    0,    0,    0,   30,    5,    0,   29,    0,    0,
-   32,    0,   22,
+    0,   78,    0,   79,    0,    0,    0,    0,    0,    0,
+    0,  129,    0,    0,   58,   57,   51,    0,    3,    0,
+  150,    0,    0,  110,    0,   41,    0,   42,    0,    0,
+    0,    0,  161,    0,    0,   35,   40,    0,    0,    0,
+  149,  158,   75,    0,  134,    0,  136,    0,  108,    0,
+    0,    0,    0,    0,    0,    0,  116,    0,  114,    0,
+  125,    0,  130,    0,   73,    0,   77,    0,    0,    0,
+    0,    0,    0,    0,    0,   70,  135,  137,  124,    0,
+  122,    0,    0,  115,    0,  120,  126,  112,   62,  151,
+    6,    0,    0,    0,    0,    0,    0,    0,    0,  123,
+  121,   71,    7,   27,   28,    0,    0,   23,   24,    0,
+   31,    0,    0,    0,   21,    0,    0,    0,   30,    5,
+    0,   29,    0,    0,   32,    0,   22,
 };
 short yydgoto[] = {                                       1,
-    9,   66,   10,   17,   85,  329,   88,  318,    3,   11,
-   12,   68,  334,  258,   70,   71,   72,   73,   74,   75,
-   76,  264,   78,  265,  254,  256,  259,  267,  255,  257,
-  112,  196,   90,   79,  234,  177,  141,  262,   13,    2,
-   14,   15,   16,
+    9,   66,   10,   17,   95,   86,  333,   89,  322,    3,
+   11,   12,   68,  338,  260,   70,   71,   72,   73,   74,
+   75,   76,  266,   78,  267,  256,  258,  261,  269,  257,
+  259,  113,  197,   91,   79,  235,   83,  178,  247,  142,
+  264,   13,    2,   14,   15,   16,   85,  253,
 };
 short yysindex[] = {                                      0,
-    0,    0,  236,    0,    0,    0,  -45,    0,    0,    0,
-    0,    0,  557,    0,    0,    0, -106, -232,  -20,    0,
-216,    0,    0,    0,   -8,   -8,    0,    9,    0, 1840,
-    0,    0,   11,   15,   19,   22,  -33, 1840,   38,   47,
-   51,  933,  877,   -8,  996, 1260, -212,    0,    0,   -8,
- 1840, 1840, 1840, 1840, 1840, 1840, 1316,    0, 1840, 1840,
- 1372,   -8,   -8,   -8,   -8, 1840, -193,    0,  273, 3713,
-  -67,  -55,    0,    0,  -26,   72,   57,   59,    0,    3,
-    0, -137,    0, -130,    0,    0,    0,    0,    0, 1840,
  96, 1840, 1871,    3, -137,    0,    0,    0,    0,    0,
-    0,   97, 3713,   99, 1431,  877,    0, 1871,    0,  -67,
-   59,    0, 1840,    0,  106,    0, 1871,  -25,   27,   52,
1840,    0,   59,   98,   98,   98,  -85,  -85,   74,  -40,
-   98,   98,    0,  -88,    0,    0,    0,    0, 1871,    3,
-    0, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
- 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
- 1840, 1840,    0,    0,  -34, 1840, 1840, 1840, 1840, 1840,
- 1840, 1606,    0, 1840,    0,    0,  -51, 1840,  242,    0,
1840, 1089, 1840,    3, 1840, 1840, 1840, 1840,  130, 1665,
   0,    0,    0,  -30,   44,  126, 1840,   59, 1721, 1777,
   0,   53,    0, 1840,   79,    0,    0, -244, -244,    0,
-244, -244, -127,    0,   54, 1027, 1871,  756,  360,  869,
3713, 3679, 3540, 3764, 1195,  340, 1054,   98,   98, 1840,
   0, 1840,    0,  134,  -83,   58,  -75,   60,  -71,   62,
-    0,  -18, 3713,    0,    0,  117,    0,  138,    0, 1840,
-    0,    0, -244,    0,  139,    0,  140, -244,  141,  142,
-    0,  145,  273,    0,    0,  149,  136, 1840,    0,    0,
-    0,  -15,    0,   40,    0,   42,    0,  -59, 1840,   68,
- 1840,   85,   46, 1840,    0,   75,    0,   77,    0,   80,
-    0,    0,    0, 1143,   84,   84,   84,   84, 1840,   84,
1840,  167,    0,    0,    0,    0,   95,    0,  263,   86,
-    0,  172,    0,    0,    0,    0,    0, -193, -193, -177,
-177,  175, -193,  159,   84,    0,    0,    0,    0,    0,
-    0,   84,  194,    0,    0,   84,    0, 1665, -193,  256,
-    0, 1840, -193,  191,    0,    0,  196,    0,   84,   84,
-    0, -177,    0,
+    0,    0, -126,    0,    0,    0,  -58,    0,    0,    0,
+    0,    0,  827,    0,    0,    0, -111, -235,  -21,    0,
   0,    0,    0,    0,  -33,  -33,    0,    7,    0, 1816,
+    0,    0,   15,   30,   61,   62,  -29, 1816,   67,   70,
+   73, 1002,  939,  -33, 1236, 1292, -227,    0,    0,  -33,
+ 1816, 1816, 1816, 1816, 1816, 1816, 1173,    0, 1816, 1816,
+ 1348,  -33,  -33,  -33,  -33, 1816, -220,    0, -169, 3558,
+  -78,  -59,    0,    0,  -38,   78,   52,   76,    0,   14,
+    0,    0, -137,    0, -118,    0,    0,    0,    0,    0,
1816,  107, 1816, 1847,   14, -137,    0,    0,    0,    0,
+    0,    0,  108, 3558,  109, 1407,  939,    0, 1847,    0,
+  -78,   76,    0, 1816,    0,  112,    0, 1847,  -23,   36,
 -51, 1816,    0,   76,  -82,  -82,  -82,  -54,  -54,   72,
+  -27,  -82,  -82,    0,  -87,    0,    0,    0,    0, 1847,
+   14,    0, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816,
+ 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816,
+ 1816, 1816, 1816,    0,    0,  -32, 1816, 1816, 1816, 1816,
+ 1816, 1816, 1582,    0, 1816,    0,    0,  -36, -108,  667,
   0, 1816,  209,    0,   14, 1816, 1816, 1816, 1816,  129,
1641,    0,    0,    0,  -16,    6,  126, 1816,   76, 1697,
1753,    0,   43,    0, 1816,   81,    0,    0, -199, -199,
   0, -199, -199, -123,    0,   18, 3516, 1847, 1089,  382,
  92, 3558, 3594, 3689,  369, 1060,  482,  285,  -82,  -82,
1816,    0, 1816,    0,  137,   33,   23,   58,   25,   69,
+   27,    0,  -14, 3558,    0,    0,    0, 1816,    0,  139,
+    0, 1816, 1816,    0, -199,    0,  141,    0,  143, -199,
+  156,  159,    0,  154, -169,    0,    0,  160,  144, 1816,
+    0,    0,    0,  -12,    0,  -10,    0,    1,    0,   71,
+ 1816,   82, 1816,   29,   86, 1816,    0,   83,    0,   84,
+    0,   89,    0,  147,    0,  339,    0,   90,   90,   90,
  90, 1816,   90, 1816,  175,    0,    0,    0,    0,   88,
+    0, 3653,   94,    0,  180,    0,    0,    0,    0,    0,
   0, -220, -220, -168, -168,  196, -220,  184,   90,    0,
+    0,    0,    0,    0,    0,   90,  205,    0,    0,   90,
+    0, 1641, -220,  688,    0, 1816, -220,  211,    0,    0,
+  213,    0,   90,   90,    0, -168,    0,
 };
 short yyrindex[] = {                                      0,
-    0,    0,  161,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  269,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0, 2076, 1906,    0,
+    0, 2716, 2784,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0, 2100, 1930,    0,
-    0, 2740, 2808,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   79,    0,   -7,  181,
+ 2827, 2871,    0,    0, 2142, 1965,    0,   21,    0,    0,
+    0,    0,  -31,    0,    0,    0,    0,    0,    0,    0,
+ 2201,    0,    0, 3299,    0,  152,    0,    0,    0,    0,
+    0,    0,    0,  197,    0,    0,  236,    0, 3343,  444,
+  545, 2312,    0,    0,    0, 2028,    0, 3386, 2827,    0,
+    0, 2201,    0, 2437, 2914, 2952, 2990,  606,  723, 2480,
+    0, 3063, 3107,    0,    0,    0,    0,    0,    0, 3424,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   37,    0,   -9, 3616,
- 2851, 2895,    0,    0, 2166, 1989,    0,   17,    0,    0,
-    0,  -39,    0,    0,    0,    0,    0,    0,    0, 2225,
-    0,    0, 3367,    0,  112,    0,    0,    0,    0,    0,
-    0,    0, 3635,    0,    0,  215,    0, 3410,  437,  498,
- 2336,    0,    0,    0, 2052,    0, 3448, 2851,    0,    0,
- 2225,    0, 2461, 2938, 2976, 3014,  -28,  600, 2504,    0,
- 3087, 3131,    0,    0,    0,    0,    0,    0, 3486,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0, 2548,    0,    0,    0,    0,  883,
+    0,  236,    0,    0,    0,  239,    0,    0,    0,    0,
+  230,    0,    0,    0,    0,  251,    0,    0, 2591,    0,
+    0,    0,    0,    0,    0, 2635,    0,    0,   -2,    2,
+    0,    8,   22,  525,    0,    0, 3579, 1448, 1504, 3226,
+  -39,  338,    0, 2490, 3535, 3498, 3462, 3262, 3150, 3188,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0, 2572,    0,    0,    0,  205,  821,    0,
-  215,    0, 2225,    0,  245,    0,    0,    0,    0,  240,
-    0,    0,    0,    0,  272,    0,    0, 2615,    0,    0,
-    0,    0,    0,    0, 2659,    0,    0,    5,   45,    0,
-   49,   61,  -32,    0,    0,  192, 1472, 1528, 3250, 3286,
- 3645,    0, 2514, 3603, 3559, 3522, 3323, 3174, 3212,    0,
+    0,    0,    0, 1870,    0,    0,    0,  238,    0,    0,
+    0,    0, 2201,    0,   24,    0,    0,    0,    0,  260,
+    0,    0,    0,    0,   37,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0, 3675,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   65,    0,    0,    0,    0,  277,    0,    0,
-    0,    0,   66,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,  236,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  215,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  249,    0,    0,    0,    0,    0,    0,
+    0,  718,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,   79,   79,  153,  153,    0,   79,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  265,    0,    0,    0,    0,    0,    0,    0, 1894,    0,
-    0,    0,    0,    0,    0,    0,    0,   37,   37,  105,
-  105,    0,   37,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  286,   37,  821,
-    0,    0,   37,    0,    0,    0,    0,    0,    0,    0,
-    0,  105,    0,
+    0,  272,   79,  883,    0,    0,   79,    0,    0,    0,
+    0,    0,    0,    0,    0,  153,    0,
 };
 short yygindex[] = {                                      0,
-    0,    0,    0,   63,  418,    0,  914,  335,  -81,    0,
-    0,    0, -292,  -13, 3885, 2516,    0,    0,    0,    0,
-    0,  321,  530,    0,    0,  203, -150,   -3,   93,  165,
-  -69, -162,  575,    0,    0,  300, -276,    0,    0,    0,
-    0,    0,    0,
+    0,    0,    0,   45,  278,  -26,    0,  919, 1004,  -76,
+    0,    0,    0, -310,  -13, 3871, 3724,    0,    0,    0,
+    0,    0,  304,  -25,    0,    0,  190, -175,   -1,   53,
+  188,  384, -161, 1007,    0,    0,    0,  292,    0, -287,
+    0,    0,    0,    0,    0,    0,    0,    0,
 };
-#define YYTABLESIZE 4166
+#define YYTABLESIZE 4154
 short yytable[] = {                                      69,
-  205,   62,   62,  179,  206,  166,  101,  244,   60,  285,
-  269,   60,   96,   20,  200,   96,   23,  287,  248,   53,
-  180,  289,  291,  168,   82,  303,   60,   62,  335,   96,
-   96,   15,  120,  306,   96,  170,   25,  148,   83,  266,
-   84,  330,  331,  130,  121,   18,  337,  134,   92,   15,
-   96,  203,  146,  147,   97,  167,  232,   61,   98,  353,
-   60,   99,  345,   18,   96,  168,  348,  169,   18,   25,
-   21,   23,   25,   25,   25,   61,   25,  104,   25,   25,
-  304,   25,  305,   53,  140,   38,  105,  270,  230,   16,
-  106,  194,  195,   94,   95,   25,  171,  167,  332,  333,
-   25,   17,  174,   38,   20,   37,   39,   16,  246,   61,
-  202,  172,  280,  251,   23,  173,  286,  302,  288,   17,
-  290,  312,  176,   37,   15,   23,  178,   25,  208,  209,
-  211,  212,  213,  214,  215,  181,  191,   20,  311,  192,
-   20,   20,   20,  310,   20,  199,   20,   20,  322,   20,
-   80,  201,  235,  236,  237,  238,  239,  240,  242,   25,
-    2,   25,   25,   20,  204,   62,  271,  195,   20,  279,
-  147,  253,  209,  284,  209,  292,  263,  277,  293,  295,
-  296,  297,  298,  272,  299,  274,  276,  326,  166,  300,
-  278,  347,  308,   43,  301,   20,   43,   43,   43,  313,
-   43,  314,   43,   43,  315,   43,  317,  325,  146,  147,
-  327,   19,  328,  146,  147,  336,  282,  338,  283,   43,
-  148,  146,  147,  231,   43,  146,  147,   20,  165,   20,
-   20,  349,   84,  342,   53,   84,  350,  146,  147,   60,
-   60,   60,   60,   96,   96,   96,   96,  340,   86,   84,
-   84,   43,   96,   87,   84,  151,  146,  147,   96,   96,
-   96,   96,  100,  149,   60,  307,  146,  147,   96,   96,
-  195,   96,   96,   96,   96,   96,   96,   96,  146,  147,
-   96,  146,  147,   43,   84,   36,   43,  253,   61,   61,
-   61,   61,   25,   25,   25,   25,   25,   25,   34,   25,
-   25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
-   25,   25,  152,   61,   61,   25,   25,   39,   25,   25,
-   25,   25,   25,   36,   69,  155,   34,   25,   25,   25,
-   25,   25,   25,   77,  344,   25,  146,  147,  146,  147,
-  146,  147,  146,  147,   25,  210,   25,   25,  146,  147,
-  146,  147,  260,  166,  146,  147,  146,  147,  146,  147,
-   20,   20,   20,   20,   20,   20,  247,   20,   20,   20,
-   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
-  346,  146,  147,   20,   20,  148,   20,   20,   20,   20,
-   20,  146,  147,  324,  184,   20,   20,   20,   20,   20,
-   20,    0,    0,   20,    0,    0,  162,    0,    0,  163,
-  164,  165,   20,    0,   20,   20,   43,   43,   43,   43,
-   43,   43,    0,   43,   43,   43,    0,    0,    0,   43,
-  166,    0,   43,   43,   43,   43,    0,    0,    0,   43,
-   43,    0,   43,   43,   43,   43,   43,    0,    0,    0,
-  166,   43,   43,   43,   43,   43,   43,    0,    0,   43,
-    0,    0,  148,   84,   84,   84,   84,    0,   43,  163,
-   43,   43,  163,  163,  163,    0,  163,  147,  163,  163,
-  147,  163,  148,    0,    0,    0,    0,    0,   84,   84,
-    0,   84,    0,    0,  147,  147,    0,    0,    0,  147,
-  163,    4,    5,    6,    0,    7,    8,    4,    5,    6,
-    0,    7,    8,  185,  186,  187,  188,  189,  190,    0,
-    0,    4,    5,    6,    0,    7,    8,  147,    0,  147,
-  164,    0,    0,  164,  164,  164,    0,  164,  106,  164,
-  164,  106,  164,  149,  142,  143,  144,  145,    0,  150,
-  151,  152,  153,    0,    0,  106,  106,    0,    0,  147,
-  106,  164,  163,  156,  157,  158,  159,  160,  161,  146,
-  147,  162,  111,    0,  163,  164,  165,    0,    0,    0,
-  123,    0,    0,    0,    0,    0,    0,    0,    0,   52,
-  106,    0,   62,   64,   50,    0,   57,    0,   65,   60,
-   91,   59,    0,    0,    0,    0,    0,    0,  268,    0,
-    0,    0,    0,    0,    0,   58,    0,  113,  114,  111,
-   63,    0,    0,  164,  122,    0,  150,  151,  152,  153,
-  319,  320,  321,    0,  323,    0,  135,  136,  137,  138,
-   97,    0,  198,   97,  160,  161,    0,   61,  162,    0,
-  111,  163,  164,  165,    0,    0,    0,   97,   97,  339,
-    0,    0,   97,    0,    0,  161,  341,    0,  162,    0,
-  343,  163,  164,  165,    0,    0,    0,    0,    0,   23,
-  197,    0,   53,  351,  352,    0,    0,    0,    0,    0,
-    0,    0,   97,  163,  163,  163,  163,  163,    0,  163,
-  163,  163,    0,    0,    0,  163,    0,  111,  147,  147,
-  147,  147,  111,    0,    0,    0,  163,  147,  163,  163,
-  163,  163,  163,  147,  147,  147,  147,  163,  163,  163,
-  163,  163,  163,  147,  147,  163,  147,  147,  147,  147,
-  147,  147,  147,    0,  163,  147,  163,  163,  147,  147,
-  147,    0,    0,    0,  164,  164,  164,  164,  164,    0,
-  164,  164,  164,    0,    0,    0,  164,    0,    0,  106,
-  106,  106,  106,    0,    0,    0,    0,  164,  106,  164,
-  164,  164,  164,  164,  106,  106,  106,  106,  164,  164,
-  164,  164,  164,  164,  106,  106,  164,  106,  106,  106,
-  106,  106,  106,  106,    0,  164,  106,  164,  164,  106,
-  106,  106,   22,   24,   25,   26,   27,   28,    0,   29,
-   30,   31,    0,    0,    0,   32,    0,    0,   33,   34,
-   35,   36,    0,    0,    0,   37,   38,    0,   39,   40,
-   41,   42,   43,    0,    0,    0,  166,   44,   45,   46,
-   47,   48,   49,   43,    0,   51,   43,   43,   43,    0,
-   43,    0,   43,   43,   54,   43,   55,   56,    0,    0,
-    0,   97,   97,   97,   97,    0,    0,    0,  148,   43,
-   97,    0,    0,    0,   43,    0,   97,   97,   97,   97,
-    0,    0,    0,    0,    0,    0,   97,   97,    0,   97,
-   97,   97,   97,   97,   97,   97,    0,    0,   97,   52,
-    0,   43,   62,   64,   50,    0,   57,    0,   65,   60,
-    0,   59,    0,    0,    0,    0,   67,    0,    0,    0,
-   81,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   63,    0,    0,   43,    0,    0,   43,    0,    0,    0,
-    0,    0,    0,    0,    0,  107,    0,    0,  116,  166,
-    0,    0,    0,    0,    0,   52,    0,   61,   62,   64,
-   50,    0,   57,    0,   65,   60,    0,   59,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  148,    0,  175,    0,    0,   63,    0,    0,   23,
-    0,    0,   53,    0,    0,    0,    0,  183,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   61,    0,    0,    0,    0,   52,    0,
-    0,   62,   64,   50,    0,   57,    0,   65,   60,    0,
-   59,    0,  150,    0,  152,  153,    0,    0,    0,    0,
-    0,    0,    0,  207,    0,   23,    0,    0,   53,   63,
-  160,  161,    0,    0,  162,    0,    0,  163,  164,  165,
-    0,    0,    0,    0,    0,    0,   43,   43,   43,   43,
-   43,   43,    0,   43,   43,   43,   61,    0,    0,   43,
-  245,    0,   43,   43,   43,   43,    0,  252,    0,   43,
-   43,    0,   43,   43,   43,   43,   43,    0,    0,    0,
-    0,   43,   43,   43,   43,   43,   43,  166,   23,   43,
-    0,   53,    0,    0,    0,    0,    0,    0,   43,  249,
-   43,   43,  250,  109,   25,   26,   27,   28,   87,   29,
-   30,   31,    0,    0,  166,   32,    0,    0,    0,  148,
-    0,  155,    0,    0,    0,    0,   38,  152,   39,   40,
-   41,   42,   43,    0,    0,    0,    0,   44,   45,   46,
-   47,   48,   49,    0,  161,   51,  148,  162,    0,  166,
-  163,  164,  165,  316,   54,    0,   55,   56,    0,   24,
-   25,   26,   27,   28,    0,   29,   30,   31,    0,    0,
-    0,   32,    0,    0,    0,  155,    0,    0,    0,    0,
-    0,  148,   38,    0,   39,   40,   41,   42,   43,    0,
+   20,   83,   62,   62,   83,  207,   62,  203,  167,  180,
+  102,   23,  169,  206,  339,  268,  201,  112,   83,   83,
+  250,   82,  245,   83,  271,  124,  293,   55,  306,  122,
+  307,  171,  121,   15,  334,  335,  167,   84,   18,  341,
+  149,  308,   38,  131,  168,  357,   93,  135,   16,  272,
+   18,   15,   21,   83,   97,  349,   18,  141,  233,  352,
+   38,   65,   17,  170,   37,  112,   16,  169,  149,   98,
+  186,  187,  188,  189,  190,  191,  282,   39,   25,   65,
+   17,  288,   37,  290,  172,  292,   23,  313,  199,   23,
+  231,   55,  195,  196,  305,   15,  112,  147,  148,  168,
+   99,  100,  143,  144,  145,  146,  105,  336,  337,  106,
+  174,   25,  107,   65,   25,   25,   25,  173,   25,  175,
+   25,   25,  177,   25,  315,  287,  326,  147,  148,  209,
+  210,  212,  213,  214,  215,  216,   23,   25,  179,    4,
+    5,    6,   25,    7,    8,   80,  182,  192,  248,  193,
+  289,  200,   20,  236,  237,  238,  239,  240,  241,  243,
+  202,  291,  205,  309,   62,  270,  273,  279,  196,   25,
+  351,  281,  255,  210,  148,  210,  286,  265,  314,  295,
+  330,  298,  167,  299,  274,   20,  276,  278,   20,   20,
+   20,  280,   20,  302,   20,   20,  300,   20,   19,  301,
+  303,   25,  304,   25,   25,  319,  311,  316,  317,  147,
+  148,   20,  321,  318,  149,  329,   20,  284,  331,  285,
+  332,   68,  112,   87,   68,  232,  163,  112,   88,  164,
+  165,  166,   83,   83,   83,   83,  340,  139,   68,   68,
+  139,   83,  342,   20,  346,  147,  148,   83,   83,  251,
+   83,  353,  252,  354,  139,  139,  344,   83,   83,  166,
+   83,   83,   83,   83,   83,   83,  101,  310,    2,  147,
+  148,  156,  196,   68,   55,   20,  156,   20,   20,   36,
+  147,  148,  147,  148,  147,  148,  147,  148,   34,  139,
+  255,  157,   65,   65,   65,   65,  154,  147,  148,  167,
+   39,   43,  147,  148,   43,   43,   43,   36,   43,   96,
+   43,   43,   34,   43,  147,  148,   77,   65,   65,  147,
+  148,  147,  148,  147,  148,  147,  148,   43,   69,  147,
+  148,  149,   43,  211,   25,   25,   25,   25,   25,   25,
+  348,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+   25,   25,   25,   25,  147,  148,  328,   25,   25,   43,
+   25,   25,   25,   25,   25,  147,  148,  147,  148,   25,
+   25,   25,   25,   25,   25,  167,  262,   25,   80,  320,
+  153,   80,  147,  148,  147,  148,   25,  185,   25,   25,
+    0,   43,    0,    0,   43,   80,   80,  162,    0,    0,
+  163,  156,    0,  164,  165,  166,    0,  149,   20,   20,
+   20,   20,   20,   20,    0,   20,   20,   20,   20,   20,
+   20,   20,   20,   20,   20,   20,   20,   20,    0,  167,
+   80,   20,   20,    0,   20,   20,   20,   20,   20,    0,
+    0,    0,    0,   20,   20,   20,   20,   20,   20,    0,
+    0,   20,   68,   68,   68,   68,    0,    0,    0,  167,
+   20,  149,   20,   20,    0,    0,    0,    0,  139,  139,
+  139,  139,  167,    0,  181,    0,  168,   68,   68,  168,
+  168,  168,    0,  168,  152,  168,  168,  152,  168,  150,
+    0,  149,    0,  139,  139,  151,  152,  153,  154,    0,
+    0,  152,  152,    0,  149,  204,  152,  168,  155,  157,
+  158,  159,  160,  161,  162,    0,    0,  163,    0,    0,
+  164,  165,  166,    0,   43,   43,   43,   43,   43,   43,
+    0,   43,   43,   43,  152,    0,  152,   43,    0,    0,
+   43,   43,   43,   43,    0,    0,    0,   43,   43,    0,
+   43,   43,   43,   43,   43,    0,    0,    0,    0,   43,
+   43,   43,   43,   43,   43,   64,  152,   43,   64,  168,
+    0,    0,  167,  153,  154,    0,   43,  169,   43,   43,
+  169,  169,  169,   64,  169,  111,  169,  169,  111,  169,
+  162,    0,    0,  163,    0,    0,  164,  165,  166,    0,
+    0,    0,  111,  111,  149,    0,    0,  111,  169,   80,
+   80,   80,   80,    0,    0,    0,    0,   64,    0,  150,
+    0,    0,    0,    0,    0,  151,  152,  153,  154,    0,
+    0,  294,    0,    0,   80,   80,  297,  111,  155,  157,
+  158,  159,  160,  161,  162,    0,  101,  163,    0,  101,
+  164,  165,  166,    0,    0,  151,  152,  153,  154,    0,
+    0,    0,    0,  101,  101,    0,    0,    0,  101,    0,
+  169,  159,  160,  161,  162,    0,    0,  163,    0,    0,
+  164,  165,  166,    0,    0,    0,    0,  162,    0,    0,
+  163,    0,    0,  164,  165,  166,    0,    0,  101,    0,
+  168,  168,  168,  168,  168,    0,  168,  168,  168,    0,
+    0,    0,  168,    0,    0,  152,  152,  152,  152,    0,
+    0,    0,    0,  168,  152,  168,  168,  168,  168,  168,
+  152,  152,  152,  152,  168,  168,  168,  168,  168,  168,
+  152,  152,  168,  152,  152,  152,  152,  152,  152,  152,
+    0,  168,  152,  168,  168,  152,  152,  152,   92,    0,
+    0,   92,    0,  102,    0,    0,  102,    0,  151,  152,
+  153,  154,    0,    0,    0,   92,   92,    0,    0,    0,
+  102,  102,    0,    0,    0,  102,  161,  162,    0,    0,
+  163,  249,    0,  164,  165,  166,   64,   64,   64,   64,
+    0,  169,  169,  169,  169,  169,    0,  169,  169,  169,
+   92,    0,  350,  169,    0,  102,  111,  111,  111,  111,
+    0,   64,    0,    0,  169,  111,  169,  169,  169,  169,
+  169,  111,  111,  111,  111,  169,  169,  169,  169,  169,
+  169,  111,  111,  169,  111,  111,  111,  111,  111,  111,
+  111,    0,  169,  111,  169,  169,  111,  111,  111,   52,
+    0,    0,   62,   64,   50,    0,   57,    0,   65,   60,
+    0,   59,    0,    0,    0,    0,    0,  101,  101,  101,
+  101,    0,    0,    0,    0,   58,  101,    0,    0,    0,
+   63,    0,  101,  101,  101,  101,    0,    0,    0,    0,
+    0,    0,  101,  101,    0,  101,  101,  101,  101,  101,
+  101,  101,    0,    0,  101,   43,    0,   61,   43,   43,
+   43,    0,   43,    0,   43,   43,    0,   43,    0,    0,
+    0,   67,    4,    5,    6,   81,    7,    8,    0,    0,
+    0,   43,    0,    0,    0,    0,   43,    0,    0,   23,
+    0,    0,   53,    4,    5,    6,    0,    7,    8,    0,
+  108,    0,    0,  117,    0,    0,    0,    0,    0,    0,
+    0,   52,    0,   43,   62,   64,   50,    0,   57,    0,
+   65,   60,    0,   59,    0,    0,    0,    0,    0,   92,
+   92,   92,   92,    0,  102,  102,  102,  102,  176,    0,
+    0,    0,   63,  102,    0,   43,    0,    0,   43,  102,
+  102,  102,  102,  184,   92,   92,    0,   92,    0,  102,
+  102,    0,  102,  102,  102,  102,  102,  102,  102,   61,
+    0,  102,   92,    0,   52,    0,    0,   62,   64,   50,
+    0,   57,    0,   65,   60,    0,   59,    0,    0,  114,
+  115,    0,    0,    0,    0,    0,  123,    0,    0,  208,
+    0,   23,    0,    0,   53,   63,    0,    0,  136,  137,
+  138,  139,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   22,   24,   25,   26,   27,   28,    0,   29,
+   30,   31,   61,    0,    0,   32,  246,    0,   33,   34,
+   35,   36,    0,  254,    0,   37,   38,    0,   39,   40,
+   41,   42,   43,  198,    0,    0,    0,   44,   45,   46,
+   47,   48,   49,    0,   23,   51,    0,   53,    0,    0,
+    0,    0,    0,    0,   54,    0,   55,   56,   43,   43,
+   43,   43,   43,   43,    0,   43,   43,   43,    0,    0,
+  167,   43,    0,    0,   43,   43,   43,   43,    0,    0,
+    0,   43,   43,    0,   43,   43,   43,   43,   43,    0,
+    0,    0,    0,   43,   43,   43,   43,   43,   43,  167,
+    0,   43,  149,    0,    0,    0,    0,    0,    0,    0,
+   43,    0,   43,   43,    0,  110,   25,   26,   27,   28,
+   88,   29,   30,   31,    0,   52,    0,   32,   62,   64,
+   50,  149,   57,  130,   65,   60,    0,   59,   38,    0,
+   39,   40,   41,   42,   43,    0,    0,    0,    0,   44,
+   45,   46,   47,   48,   49,    0,   63,   51,    0,    0,
+    0,    0,    0,    0,    0,    0,   54,    0,   55,   56,
+    0,    0,    0,    0,    0,    0,    0,    0,   24,   25,
+   26,   27,   28,   61,   29,   30,   31,    0,   52,    0,
+   32,   62,   64,   50,    0,   57,    0,   65,   60,    0,
+   59,   38,    0,   39,   40,   41,   42,   43,    0,    0,
+    0,    0,   44,   45,   46,   47,   48,   49,   53,   63,
+   51,    0,  323,  324,  325,    0,  327,    0,    0,   54,
+    0,   55,   56,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   52,    0,   61,   62,   64,   50,
+    0,   57,  343,   65,   60,    0,   59,    0,    0,  345,
+    0,    0,    0,  347,    0,    0,  151,  152,  153,  154,
+  120,    0,    0,    0,    0,   63,  355,  356,   23,    0,
+    0,   53,    0,  160,  161,  162,    0,    0,  163,    0,
+    0,  164,  165,  166,    0,  151,    0,  153,  154,    0,
+   52,    0,   61,   62,   64,   50,    0,   57,    0,   65,
+   60,    0,   59,  161,  162,    0,    0,  163,    0,    0,
+  164,  165,  166,    0,    0,    0,    0,    0,    0,    0,
+    0,   63,    0,    0,    0,    0,    0,   53,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   24,
+   25,   26,   27,   28,    0,   29,   30,   31,   61,   52,
+  134,   32,   62,   64,   50,    0,   57,  194,   65,   60,
+    0,   59,   38,    0,   39,   40,   41,   42,   43,    0,
     0,    0,    0,   44,   45,   46,   47,   48,   49,    0,
-    0,   51,    0,  166,    0,    0,    0,    0,    0,    0,
-   54,    0,   55,   56,    0,    0,    0,    0,    0,    0,
-    0,    0,  115,   25,   26,   27,   28,    0,   29,   30,
-   31,    0,    0,    0,   32,  148,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   38,    0,   39,   40,   41,
-   42,   43,    0,    0,    0,  166,   44,   45,   46,   47,
-   48,   49,   52,    0,   51,   62,   64,   50,    0,   57,
-    0,   65,   60,   54,   59,   55,   56,    0,    0,    0,
-    0,    0,    0,  150,  151,  152,  153,  148,  119,    0,
-    0,    0,    0,   63,    0,    0,    0,  156,  157,  158,
-  159,  160,  161,    0,    0,  162,    0,    0,  163,  164,
-  165,    0,  152,  153,    0,    0,    0,    0,   52,    0,
-   61,   62,   64,   50,    0,   57,  129,   65,   60,  161,
-   59,    0,  162,    0,    0,  163,  164,  165,    0,  149,
-    0,    0,    0,    0,    0,  150,  151,  152,  153,   63,
-    0,    0,    0,    0,    0,   53,    0,    0,  154,  156,
-  157,  158,  159,  160,  161,    0,    0,  162,    0,    0,
-  163,  164,  165,    0,   52,    0,   61,   62,   64,   50,
-    0,   57,    0,   65,   60,    0,   59,    0,    0,    0,
-    0,    0,    0,  149,    0,    0,    0,    0,    0,  150,
-  151,  152,  153,    0,    0,   63,    0,    0,    0,    0,
-    0,   53,  154,  156,  157,  158,  159,  160,  161,    0,
-    0,  162,    0,    0,  163,  164,  165,    0,    0,    0,
-    0,    0,   61,   52,  133,    0,   62,   64,   50,    0,
-   57,  193,   65,   60,    0,   59,    0,    0,    0,    0,
-    0,  150,  151,  152,  153,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,   63,    0,    0,   53,  159,  160,
-  161,    0,    0,  162,    0,    0,  163,  164,  165,    0,
-    0,    0,   80,    0,    0,   80,   24,   25,   26,   27,
-   28,   61,   29,   30,   31,    0,    0,    0,   32,   80,
-   80,    0,    0,    0,   80,    0,    0,    0,    0,   38,
-    0,   39,   40,   41,   42,   43,    0,    0,    0,    0,
-   44,   45,   46,   47,   48,   49,   53,    0,   51,    0,
-    0,    0,    0,    0,   80,    0,    0,   54,   81,   55,
-   56,   81,   24,   25,   26,   27,   28,    0,   29,   30,
-   31,    0,    0,    0,   32,   81,   81,    0,    0,    0,
-   81,    0,    0,    0,    0,   38,    0,   39,   40,   41,
+   63,   51,    0,   53,    0,    0,    0,    0,    0,    0,
+   54,    0,   55,   56,    0,    0,    0,    0,   85,    0,
+    0,   85,  116,   25,   26,   27,   28,   61,   29,   30,
+   31,    0,    0,    0,   32,   85,   85,    0,    0,    0,
+   85,    0,    0,    0,    0,   38,    0,   39,   40,   41,
    42,   43,    0,    0,    0,    0,   44,   45,   46,   47,
-   48,   49,    0,    0,   51,    0,    0,    0,    0,    0,
-   81,    0,    0,   54,    0,   55,   56,    0,   24,   25,
-   26,   27,   28,    0,   29,   30,   31,    0,   52,    0,
-   32,   62,   64,   50,    0,   57,  241,   65,   60,    0,
+   48,   49,   53,    0,   51,    0,    0,    0,    0,    0,
+   85,    0,    0,   54,   86,   55,   56,   86,   24,   25,
+   26,   27,   28,    0,   29,   30,   31,    0,    0,    0,
+   32,   86,   86,    0,    0,    0,   86,    0,    0,    0,
+    0,   38,    0,   39,   40,   41,   42,   43,    0,    0,
+    0,    0,   44,   45,   46,   47,   48,   49,    0,    0,
+   51,    0,    0,    0,    0,    0,   86,    0,    0,   54,
+    0,   55,   56,    0,   24,   25,   26,   27,   28,    0,
+   29,   30,   31,    0,   52,    0,   32,   62,   64,   50,
+    0,   57,  242,   65,   60,    0,   59,   38,    0,   39,
+   40,   41,   42,   43,    0,    0,    0,    0,   44,   45,
+   46,   47,   48,   49,    0,   63,   51,    0,    0,    0,
+    0,    0,    0,    0,    0,   54,    0,   55,   56,    0,
+    0,    0,    0,   24,   25,   26,   27,   28,    0,   29,
+   30,   31,   61,   52,    0,   32,   62,   64,   50,    0,
+   57,    0,   65,   60,    0,   59,   38,    0,   39,   40,
+   41,   42,   43,    0,    0,    0,    0,   44,   45,   46,
+   47,   48,   49,    0,   63,   51,    0,   53,    0,    0,
+    0,    0,    0,    0,   54,    0,   55,   56,    0,   85,
+   85,   85,   85,    0,    0,    0,    0,    0,   85,   52,
+    0,   61,   62,   64,   50,   85,   57,  275,   65,   60,
+    0,   59,    0,    0,   85,   85,    0,   85,   85,   85,
+   85,   85,    0,    0,    0,    0,    0,    0,    0,    0,
+   63,    0,    0,    0,    0,    0,   53,    0,    0,    0,
+    0,    0,    0,    0,    0,   86,   86,   86,   86,    0,
+    0,    0,    0,    0,   86,   52,    0,   61,   62,   64,
+   50,    0,   57,  277,   65,   60,    0,   59,    0,    0,
+   86,   86,    0,   86,   86,   86,   86,   86,    0,    0,
+    0,    0,    0,    0,    0,    0,   63,    0,    0,    0,
+    0,    0,   53,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   24,   25,
+   26,   27,   28,   61,   29,   30,   31,    0,   52,    0,
+   32,   62,   64,   50,    0,   57,    0,   65,   60,    0,
    59,   38,    0,   39,   40,   41,   42,   43,    0,    0,
-    0,    0,   44,   45,   46,   47,   48,   49,    0,   63,
+    0,    0,   44,   45,   46,   47,   48,   49,   53,   63,
    51,    0,    0,    0,    0,    0,    0,    0,    0,   54,
-    0,   55,   56,    0,    0,    0,    0,   24,   25,   26,
-   27,   28,    0,   29,   30,   31,   61,   52,    0,   32,
-   62,   64,   50,    0,   57,    0,   65,   60,    0,   59,
-   38,    0,   39,   40,   41,   42,   43,    0,    0,    0,
-    0,   44,   45,   46,   47,   48,   49,    0,   63,   51,
-    0,   53,    0,    0,    0,    0,    0,    0,   54,    0,
-   55,   56,    0,   80,   80,   80,   80,    0,    0,    0,
-    0,    0,   80,   52,    0,   61,   62,   64,   50,   80,
-   57,  273,   65,   60,    0,   59,    0,    0,   80,   80,
-    0,   80,   80,   80,   80,   80,    0,    0,    0,    0,
-    0,    0,    0,    0,   63,    0,    0,    0,    0,    0,
-   53,    0,    0,    0,    0,    0,    0,    0,    0,   81,
-   81,   81,   81,    0,    0,    0,    0,    0,   81,   52,
-    0,   61,   62,   64,   50,    0,   57,  275,   65,   60,
-    0,   59,    0,    0,   81,   81,    0,   81,   81,   81,
-   81,   81,    0,    0,    0,    0,    0,    0,    0,    0,
-   63,    0,    0,    0,    0,    0,   53,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   24,   25,   26,   27,   28,   61,   29,   30,
-   31,    0,   52,    0,   32,   62,   64,   50,    0,   57,
-    0,   65,   60,    0,   59,   38,    0,   39,   40,   41,
-   42,   43,    0,    0,    0,    0,   44,   45,   46,   47,
-   48,   49,   53,   63,   51,    0,    0,    0,    0,    0,
-    0,    0,    0,   54,    0,   55,   56,    0,    0,    0,
-   22,   24,   25,   26,   27,   28,    0,   29,   30,   31,
-   61,    0,    0,   32,   87,    0,    0,   87,    0,    0,
-    0,    0,    0,    0,   38,    0,   39,   40,   41,   42,
-   43,   87,   87,    0,    0,   44,   45,   46,   47,   48,
-   49,  166,    0,   51,    0,   53,    0,    0,    0,    0,
-  140,    0,   54,  140,   55,   56,    0,   24,   25,   26,
-   27,   28,    0,   29,   30,   31,   87,  140,  140,   32,
-    0,    0,  140,  148,    0,    0,    0,    0,    0,    0,
-   38,    0,   39,   40,   41,   42,   43,    0,    0,    0,
-    0,   44,   45,   46,   47,   48,   49,    0,    0,   51,
-  140,    0,  140,    0,    0,    0,    0,    0,   54,  123,
-   55,   56,  123,   24,   25,   26,   27,   28,    0,   29,
-   30,   31,    0,    0,    0,   32,  123,  123,    0,    0,
-    0,  123,  140,    0,    0,    0,   38,    0,   39,   40,
+    0,   55,   56,    0,    0,    0,   22,   24,   25,   26,
+   27,   28,    0,   29,   30,   31,   61,    0,    0,   32,
+   67,    0,    0,   67,    0,    0,    0,    0,    0,    0,
+   38,    0,   39,   40,   41,   42,   43,   67,   67,    0,
+    0,   44,   45,   46,   47,   48,   49,  167,    0,   51,
+    0,   53,    0,    0,    0,    0,  145,    0,   54,  145,
+   55,   56,    0,   24,   25,   26,   27,   28,    0,   29,
+   30,   31,   67,  145,  145,   32,    0,    0,  145,  149,
+    0,    0,    0,    0,    0,    0,   38,    0,   39,   40,
    41,   42,   43,    0,    0,    0,    0,   44,   45,   46,
-   47,   48,   49,    0,    0,   51,    0,    0,    0,  123,
-    0,  123,    0,    0,   54,    0,   55,   56,    0,    0,
-    0,    0,  147,    0,    0,  147,   24,   25,   26,   27,
-   28,    0,   29,   30,   31,    0,    0,    0,   32,  147,
-  147,  123,    0,    0,  147,    0,    0,    0,    0,   38,
-    0,   39,   40,   41,   42,   43,    0,    0,    0,    0,
-   44,   45,   46,   47,   48,   49,    0,    0,   51,    0,
-  133,    0,  147,  133,  147,    0,    0,   54,    0,   55,
-   56,    0,    0,    0,    0,    0,    0,  133,  133,  152,
-  153,    0,  133,    0,    0,   87,   87,   87,   87,    0,
-    0,    0,    0,    0,  147,  160,  161,    0,    0,  162,
-    0,    0,  163,  164,  165,    0,    0,    0,    0,    0,
-   87,   87,  133,   87,    0,    0,    0,    0,    0,    0,
-    0,  140,  140,  140,  140,    0,  108,    0,    0,  108,
-  140,    0,    0,    0,    0,    0,  140,  140,  140,  140,
-    0,    0,  133,  108,  108,    0,  140,  140,  108,  140,
-  140,  140,  140,  140,  140,  140,    0,    0,  140,    0,
-    0,  140,  140,  140,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  108,    0,  108,    0,
-  123,  123,  123,  123,    0,  149,    0,    0,  149,  123,
-    0,    0,    0,    0,    0,  123,  123,  123,  123,    0,
-    0,    0,  149,  149,    0,  123,  123,  149,  123,  123,
-  123,  123,  123,  123,  123,    0,    0,  123,    0,    0,
-  123,  123,  123,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  149,    0,    0,
-    0,    0,    0,  147,  147,  147,  147,    0,    0,    0,
-    0,    0,  147,    0,    0,    0,    0,    0,  147,  147,
-  147,  147,    0,    0,    0,    0,    0,  149,  147,  147,
-    0,  147,  147,  147,  147,  147,  147,  147,    0,    0,
-  147,    0,    0,  147,  147,  147,    0,    0,    0,    0,
-    0,  133,  133,  133,  133,    0,  150,    0,    0,    0,
-  133,    0,    0,    0,    0,    0,  133,  133,  133,  133,
-    0,    0,    0,  150,  150,    0,  133,  133,  150,  133,
-  133,  133,  133,  133,  133,  133,    0,    0,  133,    0,
-    0,  133,  133,  133,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  150,    0,  150,    0,
-    0,    0,    0,    0,    0,    0,    0,  108,  108,  108,
-  108,    0,    0,    0,    0,    0,  108,    0,    0,    0,
-    0,    0,  108,  108,  108,  108,    0,    0,  150,    0,
-    0,    0,  108,  108,    0,  108,  108,  108,  108,  108,
-  108,  108,    0,    0,  108,    0,    0,  108,  108,  108,
+   47,   48,   49,    0,    0,   51,  145,    0,  145,    0,
+    0,    0,    0,    0,   54,  128,   55,   56,  128,   24,
+   25,   26,   27,   28,    0,   29,   30,   31,    0,    0,
+    0,   32,  128,  128,    0,    0,    0,  128,  145,    0,
+    0,    0,   38,    0,   39,   40,   41,   42,   43,    0,
+    0,    0,    0,   44,   45,   46,   47,   48,   49,    0,
+    0,   51,    0,    0,    0,  128,    0,  128,    0,    0,
+   54,    0,   55,   56,    0,    0,    0,    0,  152,    0,
+    0,  152,   24,   25,   26,   27,   28,    0,   29,   30,
+   31,    0,    0,    0,   32,  152,  152,  128,    0,    0,
+  152,    0,    0,    0,    0,   38,    0,   39,   40,   41,
+   42,   43,    0,    0,    0,    0,   44,   45,   46,   47,
+   48,   49,    0,    0,   51,    0,  138,    0,  152,  138,
+  152,    0,    0,   54,    0,   55,   56,    0,    0,    0,
+    0,    0,    0,  138,  138,  153,  154,    0,  138,    0,
+    0,   67,   67,   67,   67,    0,    0,    0,    0,    0,
+  152,  161,  162,    0,    0,  163,    0,    0,  164,  165,
+  166,    0,    0,    0,    0,    0,   67,   67,  138,    0,
+    0,    0,    0,    0,    0,    0,    0,  145,  145,  145,
+  145,    0,  113,    0,    0,  113,  145,    0,    0,    0,
+    0,    0,  145,  145,  145,  145,    0,    0,  138,  113,
+  113,    0,  145,  145,  113,  145,  145,  145,  145,  145,
+  145,  145,    0,    0,  145,    0,    0,  145,  145,  145,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  113,    0,  113,    0,  128,  128,  128,  128,
+    0,  154,    0,    0,  154,  128,    0,    0,    0,    0,
+    0,  128,  128,  128,  128,    0,    0,    0,  154,  154,
+    0,  128,  128,  154,  128,  128,  128,  128,  128,  128,
+  128,    0,    0,  128,    0,    0,  128,  128,  128,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  154,    0,    0,    0,    0,    0,  152,
+  152,  152,  152,    0,    0,    0,    0,    0,  152,    0,
+    0,    0,    0,    0,  152,  152,  152,  152,    0,    0,
+    0,    0,    0,  154,  152,  152,    0,  152,  152,  152,
+  152,  152,  152,  152,    0,    0,  152,    0,    0,  152,
+  152,  152,    0,    0,    0,    0,    0,  138,  138,  138,
+  138,    0,  155,    0,    0,    0,  138,    0,    0,    0,
+    0,    0,  138,  138,  138,  138,    0,    0,    0,  155,
+  155,    0,  138,  138,  155,  138,  138,  138,  138,  138,
+  138,  138,    0,    0,  138,    0,    0,  138,  138,  138,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  155,    0,  155,    0,    0,    0,    0,    0,
+    0,    0,    0,  113,  113,  113,  113,    0,    0,    0,
+    0,    0,  113,    0,    0,    0,    0,    0,  113,  113,
+  113,  113,    0,    0,  155,    0,    0,    0,  113,  113,
+    0,  113,  113,  113,  113,  113,  113,  113,    0,    0,
+  113,    0,    0,  113,  113,  113,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  154,  154,  154,  154,    0,  140,    0,    0,
+    0,  154,    0,    0,    0,    0,    0,  154,  154,  154,
+  154,    0,    0,    0,  140,  140,    0,  154,  154,  140,
+  154,  154,  154,  154,  154,  154,  154,    0,    0,  154,
+    0,    0,  154,  154,  154,    0,    0,    0,    0,    0,
+  105,    0,    0,  105,    0,    0,    0,  140,    0,  140,
+   91,    0,    0,   91,    0,    0,    0,  105,  105,    0,
+    0,    0,  105,    0,    0,    0,    0,   91,   91,    0,
+    0,    0,   91,    0,    0,    0,    0,    0,    0,  140,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  105,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   91,  155,  155,  155,  155,    0,   66,    0,
+    0,   66,  155,    0,    0,    0,    0,    0,  155,  155,
+  155,  155,  105,    0,    0,   66,   66,    0,  155,  155,
+   66,  155,  155,  155,  155,  155,  155,  155,    0,    0,
+  155,    0,    0,  155,  155,  155,    0,    0,    0,    0,
+    0,   69,    0,    0,    0,    0,    0,    0,    0,    0,
+   66,    0,    0,    0,    0,    0,    0,    0,   69,   69,
+    0,    0,    0,   69,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  149,  149,  149,  149,
-    0,  135,    0,    0,    0,  149,    0,    0,    0,    0,
-    0,  149,  149,  149,  149,    0,    0,    0,  135,  135,
-    0,  149,  149,  135,  149,  149,  149,  149,  149,  149,
-  149,    0,    0,  149,    0,    0,  149,  149,  149,    0,
-   89,   89,    0,    0,  100,    0,    0,  100,    0,    0,
-    0,  135,  102,  135,   86,    0,    0,   86,  110,   89,
-  118,  100,  100,    0,    0,   89,  100,    0,    0,    0,
-    0,   86,   86,    0,    0,    0,   86,   89,   89,   89,
-   89,    0,    0,  135,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  100,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   86,  150,  150,  150,
-  150,    0,   62,    0,    0,   62,  150,    0,    0,    0,
-    0,  110,  150,  150,  150,  150,  100,    0,    0,   62,
-   62,    0,  150,  150,   62,  150,  150,  150,  150,  150,
-  150,  150,    0,    0,  150,    0,    0,  150,  150,  150,
-    0,    0,    0,    0,    0,   65,    0,    0,    0,    0,
-    0,    0,    0,    0,   62,    0,    0,    0,    0,    0,
-    0,    0,   65,   65,    0,    0,    0,   65,    0,    0,
-  233,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,   62,    0,    0,    0,    0,   99,
-    0,    0,   99,    0,  261,   65,    0,   65,    0,    0,
-    0,    0,    0,    0,    0,    0,   99,   99,    0,    0,
-    0,   99,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  135,  135,  135,  135,    0,   65,    0,    0,
-    0,  135,    0,    0,    0,    0,    0,  135,  135,  135,
-  135,   99,    0,    0,    0,    0,    0,  135,  135,    0,
-  135,  135,  135,  135,  135,  135,  135,    0,    0,  135,
-    0,    0,  135,  135,  135,  100,  100,  100,  100,    0,
-  136,   99,    0,  136,  100,   86,   86,   86,   86,    0,
-  100,  100,  100,  100,   86,    0,    0,  136,  136,    0,
-  100,  100,  136,  100,  100,  100,  100,  100,  100,  100,
-   86,   86,  100,   86,   86,  100,  100,  100,    0,    0,
+   66,    0,    0,    0,    0,  104,    0,    0,  104,    0,
+    0,   69,    0,   69,    0,    0,    0,    0,    0,    0,
+    0,    0,  104,  104,    0,    0,    0,  104,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  140,  140,
+  140,  140,    0,   69,    0,    0,    0,  140,    0,    0,
+    0,    0,    0,  140,  140,  140,  140,  104,    0,    0,
+    0,    0,    0,  140,  140,    0,  140,  140,  140,  140,
+  140,  140,  140,    0,    0,  140,    0,    0,  140,  140,
+  140,  105,  105,  105,  105,    0,  141,  104,    0,  141,
+  105,   91,   91,   91,   91,    0,  105,  105,  105,  105,
+   91,    0,    0,  141,  141,    0,  105,  105,  141,  105,
+  105,  105,  105,  105,  105,  105,   91,   91,  105,   91,
+   91,  105,  105,  105,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  141,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   66,
+   66,   66,   66,    0,  154,    0,    0,  154,   66,    0,
+    0,    0,    0,    0,   66,   66,   66,   66,    0,    0,
+    0,  154,  154,    0,   66,   66,  154,   66,   66,   66,
+   66,   66,   66,   66,    0,    0,   66,    0,    0,   66,
+   66,   66,   69,   69,   69,   69,    0,  111,    0,    0,
+  111,   69,    0,    0,    0,    0,  154,   69,   69,   69,
+   69,    0,    0,    0,  111,  111,    0,   69,   69,  111,
+   69,   69,   69,   69,   69,   69,   69,    0,    0,   69,
+    0,    0,   69,   69,   69,    0,  104,  104,  104,  104,
+    0,  118,    0,    0,  118,  104,    0,    0,    0,  111,
+    0,  104,  104,  104,  104,    0,    0,    0,  118,  118,
+    0,  104,  104,  118,  104,  104,  104,  104,  104,  104,
+  104,    0,    0,  104,    0,    0,  104,  104,  104,    0,
+    0,    0,    0,    0,   96,    0,    0,   96,    0,    0,
+    0,    0,    0,  118,    0,    0,    0,    0,    0,    0,
+    0,   96,   96,    0,    0,    0,   96,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  141,  141,  141,
+  141,    0,   97,    0,    0,   97,  141,    0,    0,    0,
+    0,    0,  141,  141,  141,  141,   96,    0,    0,   97,
+   97,    0,  141,  141,   97,  141,  141,  141,  141,  141,
+  141,  141,    0,    0,  141,    0,    0,  141,  141,  141,
+   98,    0,    0,   98,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   97,    0,    0,   98,   98,    0,
+    0,    0,   98,    0,    0,  154,  154,  154,  154,    0,
+    0,    0,    0,    0,  154,    0,    0,    0,    0,    0,
+  154,  154,  154,  154,    0,    0,    0,    0,    0,    0,
+  154,  154,   98,  154,  154,  154,  154,  154,  154,  154,
+    0,    0,  154,    0,    0,  154,  154,  154,  111,  111,
+  111,  111,    0,   94,    0,    0,   94,  111,    0,    0,
+    0,    0,    0,  111,  111,  111,  111,    0,    0,    0,
+   94,   94,    0,  111,  111,   94,  111,  111,  111,  111,
+  111,  111,  111,    0,    0,  111,    0,    0,  111,  111,
+  111,    0,  118,  118,  118,  118,    0,   95,    0,    0,
+   95,  118,    0,    0,    0,   94,    0,  118,  118,  118,
+  118,    0,    0,    0,   95,   95,    0,  118,  118,   95,
+  118,  118,  118,  118,  118,  118,  118,    0,    0,  118,
+    0,    0,  118,  118,  118,   96,   96,   96,   96,    0,
+   93,    0,    0,   93,   96,    0,    0,    0,    0,   95,
+   96,   96,   96,   96,    0,    0,    0,   93,   93,    0,
+   96,   96,   93,   96,   96,   96,   96,   96,   96,   96,
+    0,    0,    0,   97,   97,   97,   97,    0,   81,    0,
+    0,   81,   97,    0,    0,    0,    0,    0,   97,   97,
+   97,   97,   93,    0,    0,   81,   81,    0,   97,   97,
+   81,   97,   97,   97,   97,   97,   97,   97,    0,    0,
+    0,   98,   98,   98,   98,    0,   82,    0,    0,   82,
+   98,    0,    0,    0,    0,    0,   98,   98,   98,   98,
+   81,    0,    0,   82,   82,    0,   98,   98,   82,   98,
+   98,   98,   98,   98,   98,   98,    0,    0,    0,    0,
+    0,    0,   84,    0,    0,   84,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   82,   84,
+   84,    0,    0,    0,   84,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   94,   94,   94,   94,    0,  144,
+    0,    0,  144,   94,    0,    0,    0,    0,    0,   94,
+   94,   94,   94,    0,   84,    0,  144,  144,    0,   94,
+   94,  144,   94,   94,   94,   94,   94,   94,   94,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   95,   95,
+   95,   95,    0,  143,    0,    0,  143,   95,    0,    0,
+    0,  144,    0,   95,   95,   95,   95,    0,    0,    0,
+  143,  143,    0,   95,   95,  143,   95,   95,   95,   95,
+   95,   95,   95,    0,    0,    0,    0,    0,    0,    0,
+    0,   93,   93,   93,   93,    0,  132,    0,    0,  132,
+   93,    0,    0,    0,    0,  143,   93,   93,   93,   93,
+    0,    0,    0,  132,  132,    0,   93,   93,  132,   93,
+   93,   93,   93,   93,   93,   93,    0,    0,    0,   81,
+   81,   81,   81,    0,  103,    0,    0,  103,   81,    0,
+    0,    0,    0,    0,   81,   81,   81,   81,  132,    0,
+    0,  103,  103,    0,   81,   81,  103,   81,   81,   81,
+   81,   81,   81,   81,    0,    0,    0,   82,   82,   82,
+   82,    0,   87,    0,    0,   87,   82,    0,    0,    0,
+    0,    0,   82,   82,   82,   82,  103,    0,    0,   87,
+   87,    0,   82,   82,   87,   82,   82,   82,   82,   82,
+   82,    0,    0,   84,   84,   84,   84,    0,   88,    0,
+    0,   88,   84,    0,    0,    0,    0,    0,   84,   84,
+    0,    0,    0,    0,   87,   88,   88,    0,   84,   84,
+   88,   84,   84,   84,   84,   84,   84,    0,    0,    0,
+  144,  144,  144,  144,    0,   90,    0,    0,   90,  144,
+    0,    0,    0,    0,    0,  144,  144,    0,    0,    0,
+   88,    0,   90,   90,    0,  144,  144,   90,  144,  144,
+  144,  144,  144,    0,    0,    0,  167,    0,    0,    0,
+    0,    0,    0,    0,  143,  143,  143,  143,    0,   89,
+  156,    0,   89,  143,    0,    0,    0,   90,    0,  143,
+  143,    0,    0,    0,    0,    0,   89,   89,  149,  143,
+  143,   89,  143,  143,  143,  143,  143,    0,  167,    0,
+    0,  283,    0,    0,    0,    0,  156,  132,  132,  132,
+  132,    0,    0,    0,    0,    0,  132,    0,    0,    0,
+    0,   89,  132,  132,    0,    0,    0,    0,    0,    0,
+  149,    0,  132,  132,  167,  132,  132,  132,  132,  132,
+    0,    0,    0,    0,    0,  103,  103,  103,  103,    0,
+    0,    0,    0,    0,  103,    0,    0,    0,    0,    0,
+  103,  103,    0,    0,    0,  156,  149,    0,    0,    0,
+  103,  103,    0,  103,  103,  103,  103,  103,    0,    0,
+    0,    0,    0,   87,   87,   87,   87,    0,    0,    0,
+    0,    0,   87,  167,    0,    0,    0,    0,   90,   90,
+    0,    0,    0,    0,    0,    0,    0,    0,   87,   87,
+  103,   87,   87,   87,   87,   87,  111,   90,  119,   88,
+   88,   88,   88,   90,    0,  149,    0,    0,   88,  167,
+    0,    0,    0,    0,    0,   90,   90,   90,   90,    0,
+    0,    0,    0,    0,   88,   88,    0,   88,   88,   88,
+   88,    0,  151,  152,  153,  154,   90,   90,   90,   90,
+    0,  149,    0,    0,    0,   90,  157,  158,  159,  160,
+  161,  162,    0,    0,  163,    0,    0,  164,  165,  166,
+  111,   90,   90,    0,   90,   90,   90,    0,  150,    0,
+    0,    0,    0,    0,  151,  152,  153,  154,    0,    0,
+   89,   89,   89,   89,    0,    0,    0,  155,  157,  158,
+  159,  160,  161,  162,    0,    0,  163,    0,    0,  164,
+  165,  166,    0,    0,  150,   89,   89,    0,   89,    0,
+  151,  152,  153,  154,    0,    0,    0,    0,    0,  234,
+    0,    0,    0,  155,  157,  158,  159,  160,  161,  162,
+   94,    0,  163,    0,    0,  164,  165,  166,  104,    0,
+    0,    0,  109,  263,    0,  118,    0,    0,    0,    0,
+    0,    0,  125,  126,  127,  128,  129,    0,    0,  132,
+  133,    0,    0,  150,    0,    0,  140,    0,    0,  151,
+  152,  153,  154,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  157,  158,  159,  160,  161,  162,    0,
+    0,  163,    0,  183,  164,  165,  166,    0,    0,    0,
+    0,    0,    0,    0,    0,  151,  152,  153,  154,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  136,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   62,   62,   62,   62,    0,  149,    0,
-    0,  149,   62,    0,    0,    0,    0,    0,   62,   62,
-   62,   62,    0,    0,    0,  149,  149,    0,   62,   62,
-  149,   62,   62,   62,   62,   62,   62,   62,    0,    0,
-   62,    0,    0,   62,   62,   62,   65,   65,   65,   65,
-    0,  106,    0,    0,  106,   65,    0,    0,    0,    0,
-  149,   65,   65,   65,   65,    0,    0,    0,  106,  106,
-    0,   65,   65,  106,   65,   65,   65,   65,   65,   65,
-   65,    0,    0,   65,    0,    0,   65,   65,   65,    0,
-   99,   99,   99,   99,    0,  113,    0,    0,  113,   99,
-    0,    0,    0,  106,    0,   99,   99,   99,   99,    0,
-    0,    0,  113,  113,    0,   99,   99,  113,   99,   99,
-   99,   99,   99,   99,   99,    0,    0,   99,    0,    0,
-   99,   99,   99,    0,    0,    0,    0,    0,   91,    0,
-    0,   91,    0,    0,    0,    0,    0,  113,    0,    0,
-    0,    0,    0,    0,    0,   91,   91,    0,    0,    0,
-   91,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  136,  136,  136,  136,    0,   92,    0,    0,   92,
-  136,    0,    0,    0,    0,    0,  136,  136,  136,  136,
-   91,    0,    0,   92,   92,    0,  136,  136,   92,  136,
-  136,  136,  136,  136,  136,  136,    0,    0,  136,    0,
-    0,  136,  136,  136,   93,    0,    0,   93,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,   92,    0,
-    0,   93,   93,    0,    0,    0,   93,    0,    0,  149,
-  149,  149,  149,    0,    0,    0,    0,    0,  149,    0,
-    0,    0,    0,    0,  149,  149,  149,  149,    0,    0,
-    0,    0,    0,    0,  149,  149,   93,  149,  149,  149,
-  149,  149,  149,  149,    0,    0,  149,    0,    0,  149,
-  149,  149,  106,  106,  106,  106,    0,   89,    0,    0,
-   89,  106,    0,    0,    0,    0,    0,  106,  106,  106,
-  106,    0,    0,    0,   89,   89,    0,  106,  106,   89,
-  106,  106,  106,  106,  106,  106,  106,    0,    0,  106,
-    0,    0,  106,  106,  106,    0,  113,  113,  113,  113,
-    0,   90,    0,    0,   90,  113,    0,    0,    0,   89,
-    0,  113,  113,  113,  113,    0,    0,    0,   90,   90,
-    0,  113,  113,   90,  113,  113,  113,  113,  113,  113,
-  113,    0,    0,  113,    0,    0,  113,  113,  113,   91,
-   91,   91,   91,    0,   88,    0,    0,   88,   91,    0,
-    0,    0,    0,   90,   91,   91,   91,   91,    0,    0,
-    0,   88,   88,    0,   91,   91,   88,   91,   91,   91,
-   91,   91,   91,   91,    0,    0,    0,   92,   92,   92,
-   92,    0,   76,    0,    0,   76,   92,    0,    0,    0,
-    0,    0,   92,   92,   92,   92,   88,    0,    0,   76,
-   76,    0,   92,   92,   76,   92,   92,   92,   92,   92,
-   92,   92,    0,    0,    0,   93,   93,   93,   93,    0,
-   77,    0,    0,   77,   93,    0,    0,    0,    0,    0,
-   93,   93,   93,   93,   76,    0,    0,   77,   77,    0,
-   93,   93,   77,   93,   93,   93,   93,   93,   93,   93,
-    0,    0,    0,    0,    0,    0,   78,    0,    0,   78,
+  158,  159,  160,  161,  162,    0,    0,  163,    0,    0,
+  164,  165,  166,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   77,   78,   78,    0,    0,    0,   78,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,   89,   89,
-   89,   89,    0,   79,    0,    0,   79,   89,    0,    0,
-    0,    0,    0,   89,   89,   89,   89,    0,   78,    0,
-   79,   79,    0,   89,   89,   79,   89,   89,   89,   89,
-   89,   89,   89,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   90,   90,   90,   90,    0,  139,    0,    0,
-  139,   90,    0,    0,    0,   79,    0,   90,   90,   90,
-   90,    0,    0,    0,  139,  139,    0,   90,   90,  139,
-   90,   90,   90,   90,   90,   90,   90,    0,    0,    0,
-    0,    0,    0,    0,    0,   88,   88,   88,   88,    0,
-  138,    0,    0,  138,   88,    0,    0,    0,    0,  139,
-   88,   88,   88,   88,    0,    0,    0,  138,  138,    0,
-   88,   88,  138,   88,   88,   88,   88,   88,   88,   88,
-    0,    0,    0,   76,   76,   76,   76,    0,  127,    0,
-    0,  127,   76,    0,    0,    0,    0,    0,   76,   76,
-   76,   76,  138,    0,    0,  127,  127,    0,   76,   76,
-  127,   76,   76,   76,   76,   76,   76,   76,    0,    0,
-    0,   77,   77,   77,   77,    0,   98,    0,    0,   98,
-   77,    0,    0,    0,    0,    0,   77,   77,   77,   77,
-  127,    0,    0,   98,   98,    0,   77,   77,   98,   77,
-   77,   77,   77,   77,   77,    0,    0,   78,   78,   78,
-   78,    0,   82,    0,    0,   82,   78,    0,    0,    0,
-    0,    0,   78,   78,    0,   78,    0,    0,   98,   82,
-   82,    0,   78,   78,   82,   78,   78,   78,   78,   78,
-   78,    0,    0,    0,   79,   79,   79,   79,    0,   83,
-    0,    0,   83,   79,    0,    0,    0,    0,    0,   79,
-   79,    0,    0,    0,   82,    0,   83,   83,    0,   79,
-   79,   83,   79,   79,   79,   79,   79,   79,    0,    0,
-  166,    0,    0,    0,    0,    0,    0,    0,  139,  139,
-  139,  139,    0,   85,    0,    0,   85,  139,    0,    0,
-    0,   83,    0,  139,  139,    0,   64,    0,    0,   64,
-   85,   85,  148,  139,  139,   85,  139,  139,  139,  139,
-  139,    0,    0,   64,   64,  134,    0,    0,  134,    0,
-    0,  138,  138,  138,  138,   75,    0,    0,   75,    0,
-  138,    0,  134,  134,    0,   85,  138,  138,    0,    0,
-    0,    0,   75,   75,    0,    0,  138,  138,   64,  138,
-  138,  138,  138,  138,    0,   63,    0,    0,   63,  127,
-  127,  127,  127,    0,    0,    0,    0,  134,  127,    0,
-    0,    0,   63,   63,  127,  127,  281,   75,    0,    0,
-    0,  155,    0,    0,  127,  127,    0,  127,  127,  127,
-  127,  127,    0,    0,    0,    0,    0,   98,   98,   98,
-   98,    0,    0,    0,    0,    0,   98,   63,    0,  166,
-    0,    0,   98,   98,    0,  155,    0,    0,    0,    0,
-    0,    0,   98,   98,    0,   98,   98,   98,   98,   98,
-    0,    0,    0,   82,   82,   82,   82,    0,    0,    0,
-    0,  148,   82,  166,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,   82,   82,
-    0,   82,   82,   82,   82,   82,  150,  151,  152,  153,
-   83,   83,   83,   83,    0,  148,    0,    0,    0,   83,
-    0,  157,  158,  159,  160,  161,    0,    0,  162,    0,
-    0,  163,  164,  165,  166,   83,   83,    0,   83,   83,
-   83,   83,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,   85,   85,   85,   85,    0,    0,
-    0,    0,    0,   85,    0,    0,  148,   64,   64,   64,
-   64,    0,    0,    0,    0,    0,    0,    0,    0,   85,
-   85,    0,   85,   85,   85,    0,  134,  134,  134,  134,
-    0,    0,   64,   64,   93,    0,   75,   75,   75,   75,
-    0,    0,  103,    0,    0,    0,  108,    0,    0,  117,
-    0,  134,  134,    0,    0,    0,  124,  125,  126,  127,
-  128,   75,   75,  131,  132,    0,   63,   63,   63,   63,
-  139,    0,    0,    0,    0,    0,    0,    0,    0,  149,
-    0,    0,    0,    0,    0,  150,  151,  152,  153,    0,
-    0,   63,   63,    0,    0,    0,  182,    0,  154,  156,
-  157,  158,  159,  160,  161,    0,    0,  162,    0,    0,
-  163,  164,  165,  149,    0,    0,    0,    0,    0,  150,
-  151,  152,  153,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  154,  156,  157,  158,  159,  160,  161,    0,
-    0,  162,    0,    0,  163,  164,  165,    0,    0,    0,
-    0,    0,    0,  216,  217,  218,  219,  220,  221,  222,
-  223,  224,  225,  226,  227,  228,  229,    0,    0,    0,
-  150,  151,  152,  153,    0,    0,    0,    0,  243,    0,
-    0,    0,    0,    0,    0,    0,  158,  159,  160,  161,
-    0,    0,  162,    0,    0,  163,  164,  165,    0,    0,
+  217,  218,  219,  220,  221,  222,  223,  224,  225,  226,
+  227,  228,  229,  230,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,  244,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,  294,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  309,
+    0,    0,  296,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  312,
 };
 short yycheck[] = {                                      13,
-   41,   36,   36,   85,   93,   91,   40,   59,   41,   93,
-   41,   44,   41,   59,   40,   44,  123,   93,  181,   59,
-   90,   93,   41,   91,  257,   41,   59,   36,  321,   58,
-   59,   41,   46,   93,   63,   91,    0,  123,   59,  190,
-  257,  318,  319,   57,  257,   41,  323,   61,   40,   59,
-   40,  121,  297,  298,   40,  123,   91,   41,   40,  352,
-   93,   40,  339,   59,   93,   91,  343,  123,    6,   33,
-    8,  123,   36,   37,   38,   59,   40,   40,   42,   43,
-   41,   45,   41,  123,  278,   41,   40,   44,  123,   41,
-   40,  105,  106,   31,   32,   59,  123,  123,  276,  277,
-   64,   41,   44,   59,    0,   41,   41,   59,  178,   93,
-   59,   40,   59,  183,  123,   59,   59,  268,   59,   59,
-   59,  284,  260,   59,   59,  123,  257,   91,  142,  143,
-  144,  145,  146,  147,  148,   40,   40,   33,   93,   41,
-   36,   37,   38,   59,   40,   40,   42,   43,  299,   45,
-  257,  125,  166,  167,  168,  169,  170,  171,  172,  123,
-    0,  125,  126,   59,   91,   36,   41,  181,   64,   91,
-  298,  185,  186,   40,  188,   59,  190,  125,   41,   41,
-   41,   41,   41,  197,   40,  199,  200,   93,   91,   41,
-  204,  342,  125,   33,   59,   91,   36,   37,   38,  125,
-   40,  125,   42,   43,  125,   45,  123,   41,  297,  298,
-  125,  257,   41,  297,  298,   41,  230,   59,  232,   59,
-  123,  297,  298,  258,   64,  297,  298,  123,  314,  125,
-  126,   41,   41,   40,  123,   44,   41,  297,  298,  272,
-  273,  274,  275,  272,  273,  274,  275,  329,  257,   58,
-   59,   91,  281,  262,   63,   41,  297,  298,  287,  288,
-  289,  290,  296,   59,  297,  279,  297,  298,  297,  298,
-  284,  300,  301,  302,  303,  304,  305,  306,  297,  298,
-  309,  297,  298,  123,   93,   41,  126,  301,  272,  273,
-  274,  275,  256,  257,  258,  259,  260,  261,   59,  263,
-  264,  265,  266,  267,  268,  269,  270,  271,  272,  273,
-  274,  275,   41,  297,  298,  279,  280,   41,  282,  283,
-  284,  285,  286,   59,  338,   63,   41,  291,  292,  293,
-  294,  295,  296,   13,  338,  299,  297,  298,  297,  298,
-  297,  298,  297,  298,  308,  143,  310,  311,  297,  298,
-  297,  298,  188,   91,  297,  298,  297,  298,  297,  298,
-  256,  257,  258,  259,  260,  261,  125,  263,  264,  265,
-  266,  267,  268,  269,  270,  271,  272,  273,  274,  275,
-  125,  297,  298,  279,  280,  123,  282,  283,  284,  285,
-  286,  297,  298,  301,   95,  291,  292,  293,  294,  295,
-  296,   -1,   -1,  299,   -1,   -1,  309,   -1,   -1,  312,
-  313,  314,  308,   -1,  310,  311,  256,  257,  258,  259,
-  260,  261,   -1,  263,  264,  265,   -1,   -1,   -1,  269,
-   91,   -1,  272,  273,  274,  275,   -1,   -1,   -1,  279,
-  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,
-   91,  291,  292,  293,  294,  295,  296,   -1,   -1,  299,
-   -1,   -1,  123,  272,  273,  274,  275,   -1,  308,   33,
-  310,  311,   36,   37,   38,   -1,   40,   41,   42,   43,
-   44,   45,  123,   -1,   -1,   -1,   -1,   -1,  297,  298,
-   -1,  300,   -1,   -1,   58,   59,   -1,   -1,   -1,   63,
-   64,  266,  267,  268,   -1,  270,  271,  266,  267,  268,
-   -1,  270,  271,   96,   97,   98,   99,  100,  101,   -1,
-   -1,  266,  267,  268,   -1,  270,  271,   91,   -1,   93,
-   33,   -1,   -1,   36,   37,   38,   -1,   40,   41,   42,
-   43,   44,   45,  281,  272,  273,  274,  275,   -1,  287,
-  288,  289,  290,   -1,   -1,   58,   59,   -1,   -1,  123,
-   63,   64,  126,  301,  302,  303,  304,  305,  306,  297,
-  298,  309,   43,   -1,  312,  313,  314,   -1,   -1,   -1,
-   51,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,
-   93,   -1,   36,   37,   38,   -1,   40,   -1,   42,   43,
-   26,   45,   -1,   -1,   -1,   -1,   -1,   -1,  191,   -1,
-   -1,   -1,   -1,   -1,   -1,   59,   -1,   43,   44,   90,
-   64,   -1,   -1,  126,   50,   -1,  287,  288,  289,  290,
-  296,  297,  298,   -1,  300,   -1,   62,   63,   64,   65,
-   41,   -1,  113,   44,  305,  306,   -1,   91,  309,   -1,
-  121,  312,  313,  314,   -1,   -1,   -1,   58,   59,  325,
-   -1,   -1,   63,   -1,   -1,  306,  332,   -1,  309,   -1,
-  336,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,  123,
-  106,   -1,  126,  349,  350,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   93,  257,  258,  259,  260,  261,   -1,  263,
-  264,  265,   -1,   -1,   -1,  269,   -1,  178,  272,  273,
-  274,  275,  183,   -1,   -1,   -1,  280,  281,  282,  283,
-  284,  285,  286,  287,  288,  289,  290,  291,  292,  293,
-  294,  295,  296,  297,  298,  299,  300,  301,  302,  303,
-  304,  305,  306,   -1,  308,  309,  310,  311,  312,  313,
-  314,   -1,   -1,   -1,  257,  258,  259,  260,  261,   -1,
-  263,  264,  265,   -1,   -1,   -1,  269,   -1,   -1,  272,
-  273,  274,  275,   -1,   -1,   -1,   -1,  280,  281,  282,
-  283,  284,  285,  286,  287,  288,  289,  290,  291,  292,
-  293,  294,  295,  296,  297,  298,  299,  300,  301,  302,
-  303,  304,  305,  306,   -1,  308,  309,  310,  311,  312,
-  313,  314,  256,  257,  258,  259,  260,  261,   -1,  263,
-  264,  265,   -1,   -1,   -1,  269,   -1,   -1,  272,  273,
-  274,  275,   -1,   -1,   -1,  279,  280,   -1,  282,  283,
-  284,  285,  286,   -1,   -1,   -1,   91,  291,  292,  293,
-  294,  295,  296,   33,   -1,  299,   36,   37,   38,   -1,
-   40,   -1,   42,   43,  308,   45,  310,  311,   -1,   -1,
-   -1,  272,  273,  274,  275,   -1,   -1,   -1,  123,   59,
-  281,   -1,   -1,   -1,   64,   -1,  287,  288,  289,  290,
-   -1,   -1,   -1,   -1,   -1,   -1,  297,  298,   -1,  300,
-  301,  302,  303,  304,  305,  306,   -1,   -1,  309,   33,
-   -1,   91,   36,   37,   38,   -1,   40,   -1,   42,   43,
-   -1,   45,   -1,   -1,   -1,   -1,   13,   -1,   -1,   -1,
-   17,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   64,   -1,   -1,  123,   -1,   -1,  126,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   42,   -1,   -1,   45,   91,
-   -1,   -1,   -1,   -1,   -1,   33,   -1,   91,   36,   37,
-   38,   -1,   40,   -1,   42,   43,   -1,   45,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  123,   -1,   80,   -1,   -1,   64,   -1,   -1,  123,
-   -1,   -1,  126,   -1,   -1,   -1,   -1,   94,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   91,   -1,   -1,   -1,   -1,   33,   -1,
-   -1,   36,   37,   38,   -1,   40,   -1,   42,   43,   -1,
-   45,   -1,  287,   -1,  289,  290,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  140,   -1,  123,   -1,   -1,  126,   64,
-  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,
-   -1,   -1,   -1,   -1,   -1,   -1,  256,  257,  258,  259,
-  260,  261,   -1,  263,  264,  265,   91,   -1,   -1,  269,
-  177,   -1,  272,  273,  274,  275,   -1,  184,   -1,  279,
-  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,
-   -1,  291,  292,  293,  294,  295,  296,   91,  123,  299,
-   -1,  126,   -1,   -1,   -1,   -1,   -1,   -1,  308,   41,
-  310,  311,   44,  257,  258,  259,  260,  261,  262,  263,
-  264,  265,   -1,   -1,   91,  269,   -1,   -1,   -1,  123,
-   -1,   63,   -1,   -1,   -1,   -1,  280,  289,  282,  283,
-  284,  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,
-  294,  295,  296,   -1,  306,  299,  123,  309,   -1,   91,
-  312,  313,  314,   41,  308,   -1,  310,  311,   -1,  257,
-  258,  259,  260,  261,   -1,  263,  264,  265,   -1,   -1,
-   -1,  269,   -1,   -1,   -1,   63,   -1,   -1,   -1,   -1,
-   -1,  123,  280,   -1,  282,  283,  284,  285,  286,   -1,
+   59,   41,   36,   36,   44,   93,   36,   59,   91,   86,
+   40,  123,   91,   41,  325,  191,   40,   43,   58,   59,
+  182,  257,   59,   63,   41,   51,   41,   59,   41,  257,
+   41,   91,   46,   41,  322,  323,   91,   59,   41,  327,
+  123,   41,   41,   57,  123,  356,   40,   61,   41,   44,
+    6,   59,    8,   93,   40,  343,   59,  278,   91,  347,
+   59,   41,   41,  123,   41,   91,   59,   91,  123,   40,
+   97,   98,   99,  100,  101,  102,   59,   41,    0,   59,
+   59,   59,   59,   59,  123,   59,  123,   59,  114,  123,
+  123,  123,  106,  107,  270,   59,  122,  297,  298,  123,
+   40,   40,  272,  273,  274,  275,   40,  276,  277,   40,
+   59,   33,   40,   93,   36,   37,   38,   40,   40,   44,
+   42,   43,  260,   45,  286,   93,  302,  297,  298,  143,
+  144,  145,  146,  147,  148,  149,  123,   59,  257,  266,
+  267,  268,   64,  270,  271,  257,   40,   40,  257,   41,
+   93,   40,    0,  167,  168,  169,  170,  171,  172,  173,
+  125,   93,   91,   93,   36,  192,   41,  125,  182,   91,
+  346,   91,  186,  187,  298,  189,   40,  191,   93,   41,
+   93,   41,   91,   41,  198,   33,  200,  201,   36,   37,
+   38,  205,   40,   40,   42,   43,   41,   45,  257,   41,
+   41,  123,   59,  125,  126,   59,  125,  125,  125,  297,
+  298,   59,  123,  125,  123,   41,   64,  231,  125,  233,
+   41,   41,  248,  257,   44,  258,  309,  253,  262,  312,
+  313,  314,  272,  273,  274,  275,   41,   41,   58,   59,
+   44,  281,   59,   91,   40,  297,  298,  287,  288,   41,
+  290,   41,   44,   41,   58,   59,  333,  297,  298,  314,
+  300,  301,  302,  303,  304,  305,  296,  281,    0,  297,
+  298,   63,  286,   93,  123,  123,   41,  125,  126,   41,
+  297,  298,  297,  298,  297,  298,  297,  298,   59,   93,
+  304,   41,  272,  273,  274,  275,   59,  297,  298,   91,
+   41,   33,  297,  298,   36,   37,   38,   59,   40,   32,
+   42,   43,   41,   45,  297,  298,   13,  297,  298,  297,
+  298,  297,  298,  297,  298,  297,  298,   59,  342,  297,
+  298,  123,   64,  144,  256,  257,  258,  259,  260,  261,
+  342,  263,  264,  265,  266,  267,  268,  269,  270,  271,
+  272,  273,  274,  275,  297,  298,  304,  279,  280,   91,
+  282,  283,  284,  285,  286,  297,  298,  297,  298,  291,
+  292,  293,  294,  295,  296,   91,  189,  299,   41,   41,
+  289,   44,  297,  298,  297,  298,  308,   96,  310,  311,
+   -1,  123,   -1,   -1,  126,   58,   59,  306,   -1,   -1,
+  309,   63,   -1,  312,  313,  314,   -1,  123,  256,  257,
+  258,  259,  260,  261,   -1,  263,  264,  265,  266,  267,
+  268,  269,  270,  271,  272,  273,  274,  275,   -1,   91,
+   93,  279,  280,   -1,  282,  283,  284,  285,  286,   -1,
    -1,   -1,   -1,  291,  292,  293,  294,  295,  296,   -1,
-   -1,  299,   -1,   91,   -1,   -1,   -1,   -1,   -1,   -1,
-  308,   -1,  310,  311,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  257,  258,  259,  260,  261,   -1,  263,  264,
-  265,   -1,   -1,   -1,  269,  123,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  280,   -1,  282,  283,  284,
-  285,  286,   -1,   -1,   -1,   91,  291,  292,  293,  294,
-  295,  296,   33,   -1,  299,   36,   37,   38,   -1,   40,
-   -1,   42,   43,  308,   45,  310,  311,   -1,   -1,   -1,
-   -1,   -1,   -1,  287,  288,  289,  290,  123,   59,   -1,
-   -1,   -1,   -1,   64,   -1,   -1,   -1,  301,  302,  303,
-  304,  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,
-  314,   -1,  289,  290,   -1,   -1,   -1,   -1,   33,   -1,
-   91,   36,   37,   38,   -1,   40,   41,   42,   43,  306,
-   45,   -1,  309,   -1,   -1,  312,  313,  314,   -1,  281,
-   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,   64,
-   -1,   -1,   -1,   -1,   -1,  126,   -1,   -1,  300,  301,
+   -1,  299,  272,  273,  274,  275,   -1,   -1,   -1,   91,
+  308,  123,  310,  311,   -1,   -1,   -1,   -1,  272,  273,
+  274,  275,   91,   -1,   91,   -1,   33,  297,  298,   36,
+   37,   38,   -1,   40,   41,   42,   43,   44,   45,  281,
+   -1,  123,   -1,  297,  298,  287,  288,  289,  290,   -1,
+   -1,   58,   59,   -1,  123,  122,   63,   64,  300,  301,
   302,  303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,
-  312,  313,  314,   -1,   33,   -1,   91,   36,   37,   38,
-   -1,   40,   -1,   42,   43,   -1,   45,   -1,   -1,   -1,
-   -1,   -1,   -1,  281,   -1,   -1,   -1,   -1,   -1,  287,
-  288,  289,  290,   -1,   -1,   64,   -1,   -1,   -1,   -1,
-   -1,  126,  300,  301,  302,  303,  304,  305,  306,   -1,
-   -1,  309,   -1,   -1,  312,  313,  314,   -1,   -1,   -1,
-   -1,   -1,   91,   33,   93,   -1,   36,   37,   38,   -1,
-   40,   41,   42,   43,   -1,   45,   -1,   -1,   -1,   -1,
-   -1,  287,  288,  289,  290,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   64,   -1,   -1,  126,  304,  305,
+  312,  313,  314,   -1,  256,  257,  258,  259,  260,  261,
+   -1,  263,  264,  265,   91,   -1,   93,  269,   -1,   -1,
+  272,  273,  274,  275,   -1,   -1,   -1,  279,  280,   -1,
+  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,  291,
+  292,  293,  294,  295,  296,   41,  123,  299,   44,  126,
+   -1,   -1,   91,  289,  290,   -1,  308,   33,  310,  311,
+   36,   37,   38,   59,   40,   41,   42,   43,   44,   45,
   306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,
-   -1,   -1,   41,   -1,   -1,   44,  257,  258,  259,  260,
-  261,   91,  263,  264,  265,   -1,   -1,   -1,  269,   58,
-   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,   -1,  280,
-   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,
-  291,  292,  293,  294,  295,  296,  126,   -1,  299,   -1,
-   -1,   -1,   -1,   -1,   93,   -1,   -1,  308,   41,  310,
-  311,   44,  257,  258,  259,  260,  261,   -1,  263,  264,
+   -1,   -1,   58,   59,  123,   -1,   -1,   63,   64,  272,
+  273,  274,  275,   -1,   -1,   -1,   -1,   93,   -1,  281,
+   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,
+   -1,  248,   -1,   -1,  297,  298,  253,   93,  300,  301,
+  302,  303,  304,  305,  306,   -1,   41,  309,   -1,   44,
+  312,  313,  314,   -1,   -1,  287,  288,  289,  290,   -1,
+   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,   63,   -1,
+  126,  303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,
+  312,  313,  314,   -1,   -1,   -1,   -1,  306,   -1,   -1,
+  309,   -1,   -1,  312,  313,  314,   -1,   -1,   93,   -1,
+  257,  258,  259,  260,  261,   -1,  263,  264,  265,   -1,
+   -1,   -1,  269,   -1,   -1,  272,  273,  274,  275,   -1,
+   -1,   -1,   -1,  280,  281,  282,  283,  284,  285,  286,
+  287,  288,  289,  290,  291,  292,  293,  294,  295,  296,
+  297,  298,  299,  300,  301,  302,  303,  304,  305,  306,
+   -1,  308,  309,  310,  311,  312,  313,  314,   41,   -1,
+   -1,   44,   -1,   41,   -1,   -1,   44,   -1,  287,  288,
+  289,  290,   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,
+   58,   59,   -1,   -1,   -1,   63,  305,  306,   -1,   -1,
+  309,  125,   -1,  312,  313,  314,  272,  273,  274,  275,
+   -1,  257,  258,  259,  260,  261,   -1,  263,  264,  265,
+   93,   -1,  125,  269,   -1,   93,  272,  273,  274,  275,
+   -1,  297,   -1,   -1,  280,  281,  282,  283,  284,  285,
+  286,  287,  288,  289,  290,  291,  292,  293,  294,  295,
+  296,  297,  298,  299,  300,  301,  302,  303,  304,  305,
+  306,   -1,  308,  309,  310,  311,  312,  313,  314,   33,
+   -1,   -1,   36,   37,   38,   -1,   40,   -1,   42,   43,
+   -1,   45,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
+  275,   -1,   -1,   -1,   -1,   59,  281,   -1,   -1,   -1,
+   64,   -1,  287,  288,  289,  290,   -1,   -1,   -1,   -1,
+   -1,   -1,  297,  298,   -1,  300,  301,  302,  303,  304,
+  305,  306,   -1,   -1,  309,   33,   -1,   91,   36,   37,
+   38,   -1,   40,   -1,   42,   43,   -1,   45,   -1,   -1,
+   -1,   13,  266,  267,  268,   17,  270,  271,   -1,   -1,
+   -1,   59,   -1,   -1,   -1,   -1,   64,   -1,   -1,  123,
+   -1,   -1,  126,  266,  267,  268,   -1,  270,  271,   -1,
+   42,   -1,   -1,   45,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   33,   -1,   91,   36,   37,   38,   -1,   40,   -1,
+   42,   43,   -1,   45,   -1,   -1,   -1,   -1,   -1,  272,
+  273,  274,  275,   -1,  272,  273,  274,  275,   80,   -1,
+   -1,   -1,   64,  281,   -1,  123,   -1,   -1,  126,  287,
+  288,  289,  290,   95,  297,  298,   -1,  300,   -1,  297,
+  298,   -1,  300,  301,  302,  303,  304,  305,  306,   91,
+   -1,  309,   26,   -1,   33,   -1,   -1,   36,   37,   38,
+   -1,   40,   -1,   42,   43,   -1,   45,   -1,   -1,   43,
+   44,   -1,   -1,   -1,   -1,   -1,   50,   -1,   -1,  141,
+   -1,  123,   -1,   -1,  126,   64,   -1,   -1,   62,   63,
+   64,   65,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  256,  257,  258,  259,  260,  261,   -1,  263,
+  264,  265,   91,   -1,   -1,  269,  178,   -1,  272,  273,
+  274,  275,   -1,  185,   -1,  279,  280,   -1,  282,  283,
+  284,  285,  286,  107,   -1,   -1,   -1,  291,  292,  293,
+  294,  295,  296,   -1,  123,  299,   -1,  126,   -1,   -1,
+   -1,   -1,   -1,   -1,  308,   -1,  310,  311,  256,  257,
+  258,  259,  260,  261,   -1,  263,  264,  265,   -1,   -1,
+   91,  269,   -1,   -1,  272,  273,  274,  275,   -1,   -1,
+   -1,  279,  280,   -1,  282,  283,  284,  285,  286,   -1,
+   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,   91,
+   -1,  299,  123,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  308,   -1,  310,  311,   -1,  257,  258,  259,  260,  261,
+  262,  263,  264,  265,   -1,   33,   -1,  269,   36,   37,
+   38,  123,   40,   41,   42,   43,   -1,   45,  280,   -1,
+  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,  291,
+  292,  293,  294,  295,  296,   -1,   64,  299,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  308,   -1,  310,  311,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,  258,
+  259,  260,  261,   91,  263,  264,  265,   -1,   33,   -1,
+  269,   36,   37,   38,   -1,   40,   -1,   42,   43,   -1,
+   45,  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,
+   -1,   -1,  291,  292,  293,  294,  295,  296,  126,   64,
+  299,   -1,  299,  300,  301,   -1,  303,   -1,   -1,  308,
+   -1,  310,  311,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   33,   -1,   91,   36,   37,   38,
+   -1,   40,  329,   42,   43,   -1,   45,   -1,   -1,  336,
+   -1,   -1,   -1,  340,   -1,   -1,  287,  288,  289,  290,
+   59,   -1,   -1,   -1,   -1,   64,  353,  354,  123,   -1,
+   -1,  126,   -1,  304,  305,  306,   -1,   -1,  309,   -1,
+   -1,  312,  313,  314,   -1,  287,   -1,  289,  290,   -1,
+   33,   -1,   91,   36,   37,   38,   -1,   40,   -1,   42,
+   43,   -1,   45,  305,  306,   -1,   -1,  309,   -1,   -1,
+  312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   64,   -1,   -1,   -1,   -1,   -1,  126,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,
+  258,  259,  260,  261,   -1,  263,  264,  265,   91,   33,
+   93,  269,   36,   37,   38,   -1,   40,   41,   42,   43,
+   -1,   45,  280,   -1,  282,  283,  284,  285,  286,   -1,
+   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,   -1,
+   64,  299,   -1,  126,   -1,   -1,   -1,   -1,   -1,   -1,
+  308,   -1,  310,  311,   -1,   -1,   -1,   -1,   41,   -1,
+   -1,   44,  257,  258,  259,  260,  261,   91,  263,  264,
   265,   -1,   -1,   -1,  269,   58,   59,   -1,   -1,   -1,
    63,   -1,   -1,   -1,   -1,  280,   -1,  282,  283,  284,
   285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,
-  295,  296,   -1,   -1,  299,   -1,   -1,   -1,   -1,   -1,
-   93,   -1,   -1,  308,   -1,  310,  311,   -1,  257,  258,
-  259,  260,  261,   -1,  263,  264,  265,   -1,   33,   -1,
-  269,   36,   37,   38,   -1,   40,   41,   42,   43,   -1,
-   45,  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,
-   -1,   -1,  291,  292,  293,  294,  295,  296,   -1,   64,
-  299,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  308,
-   -1,  310,  311,   -1,   -1,   -1,   -1,  257,  258,  259,
-  260,  261,   -1,  263,  264,  265,   91,   33,   -1,  269,
-   36,   37,   38,   -1,   40,   -1,   42,   43,   -1,   45,
-  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,
-   -1,  291,  292,  293,  294,  295,  296,   -1,   64,  299,
-   -1,  126,   -1,   -1,   -1,   -1,   -1,   -1,  308,   -1,
-  310,  311,   -1,  272,  273,  274,  275,   -1,   -1,   -1,
-   -1,   -1,  281,   33,   -1,   91,   36,   37,   38,  288,
-   40,   41,   42,   43,   -1,   45,   -1,   -1,  297,  298,
-   -1,  300,  301,  302,  303,  304,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   64,   -1,   -1,   -1,   -1,   -1,
-  126,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,
+  295,  296,  126,   -1,  299,   -1,   -1,   -1,   -1,   -1,
+   93,   -1,   -1,  308,   41,  310,  311,   44,  257,  258,
+  259,  260,  261,   -1,  263,  264,  265,   -1,   -1,   -1,
+  269,   58,   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,
+   -1,  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,
+   -1,   -1,  291,  292,  293,  294,  295,  296,   -1,   -1,
+  299,   -1,   -1,   -1,   -1,   -1,   93,   -1,   -1,  308,
+   -1,  310,  311,   -1,  257,  258,  259,  260,  261,   -1,
+  263,  264,  265,   -1,   33,   -1,  269,   36,   37,   38,
+   -1,   40,   41,   42,   43,   -1,   45,  280,   -1,  282,
+  283,  284,  285,  286,   -1,   -1,   -1,   -1,  291,  292,
+  293,  294,  295,  296,   -1,   64,  299,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,  308,   -1,  310,  311,   -1,
+   -1,   -1,   -1,  257,  258,  259,  260,  261,   -1,  263,
+  264,  265,   91,   33,   -1,  269,   36,   37,   38,   -1,
+   40,   -1,   42,   43,   -1,   45,  280,   -1,  282,  283,
+  284,  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,
+  294,  295,  296,   -1,   64,  299,   -1,  126,   -1,   -1,
+   -1,   -1,   -1,   -1,  308,   -1,  310,  311,   -1,  272,
   273,  274,  275,   -1,   -1,   -1,   -1,   -1,  281,   33,
-   -1,   91,   36,   37,   38,   -1,   40,   41,   42,   43,
+   -1,   91,   36,   37,   38,  288,   40,   41,   42,   43,
    -1,   45,   -1,   -1,  297,  298,   -1,  300,  301,  302,
   303,  304,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    64,   -1,   -1,   -1,   -1,   -1,  126,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  257,  258,  259,  260,  261,   91,  263,  264,
-  265,   -1,   33,   -1,  269,   36,   37,   38,   -1,   40,
-   -1,   42,   43,   -1,   45,  280,   -1,  282,  283,  284,
-  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,
-  295,  296,  126,   64,  299,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  308,   -1,  310,  311,   -1,   -1,   -1,
-  256,  257,  258,  259,  260,  261,   -1,  263,  264,  265,
-   91,   -1,   -1,  269,   41,   -1,   -1,   44,   -1,   -1,
-   -1,   -1,   -1,   -1,  280,   -1,  282,  283,  284,  285,
-  286,   58,   59,   -1,   -1,  291,  292,  293,  294,  295,
-  296,   91,   -1,  299,   -1,  126,   -1,   -1,   -1,   -1,
-   41,   -1,  308,   44,  310,  311,   -1,  257,  258,  259,
-  260,  261,   -1,  263,  264,  265,   93,   58,   59,  269,
-   -1,   -1,   63,  123,   -1,   -1,   -1,   -1,   -1,   -1,
-  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,
-   -1,  291,  292,  293,  294,  295,  296,   -1,   -1,  299,
-   91,   -1,   93,   -1,   -1,   -1,   -1,   -1,  308,   41,
-  310,  311,   44,  257,  258,  259,  260,  261,   -1,  263,
-  264,  265,   -1,   -1,   -1,  269,   58,   59,   -1,   -1,
-   -1,   63,  123,   -1,   -1,   -1,  280,   -1,  282,  283,
+   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,
+   -1,   -1,   -1,   -1,  281,   33,   -1,   91,   36,   37,
+   38,   -1,   40,   41,   42,   43,   -1,   45,   -1,   -1,
+  297,  298,   -1,  300,  301,  302,  303,  304,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   64,   -1,   -1,   -1,
+   -1,   -1,  126,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,  258,
+  259,  260,  261,   91,  263,  264,  265,   -1,   33,   -1,
+  269,   36,   37,   38,   -1,   40,   -1,   42,   43,   -1,
+   45,  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,
+   -1,   -1,  291,  292,  293,  294,  295,  296,  126,   64,
+  299,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  308,
+   -1,  310,  311,   -1,   -1,   -1,  256,  257,  258,  259,
+  260,  261,   -1,  263,  264,  265,   91,   -1,   -1,  269,
+   41,   -1,   -1,   44,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,   -1,  282,  283,  284,  285,  286,   58,   59,   -1,
+   -1,  291,  292,  293,  294,  295,  296,   91,   -1,  299,
+   -1,  126,   -1,   -1,   -1,   -1,   41,   -1,  308,   44,
+  310,  311,   -1,  257,  258,  259,  260,  261,   -1,  263,
+  264,  265,   93,   58,   59,  269,   -1,   -1,   63,  123,
+   -1,   -1,   -1,   -1,   -1,   -1,  280,   -1,  282,  283,
   284,  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,
-  294,  295,  296,   -1,   -1,  299,   -1,   -1,   -1,   91,
-   -1,   93,   -1,   -1,  308,   -1,  310,  311,   -1,   -1,
-   -1,   -1,   41,   -1,   -1,   44,  257,  258,  259,  260,
-  261,   -1,  263,  264,  265,   -1,   -1,   -1,  269,   58,
-   59,  123,   -1,   -1,   63,   -1,   -1,   -1,   -1,  280,
-   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,
-  291,  292,  293,  294,  295,  296,   -1,   -1,  299,   -1,
-   41,   -1,   91,   44,   93,   -1,   -1,  308,   -1,  310,
-  311,   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,  289,
-  290,   -1,   63,   -1,   -1,  272,  273,  274,  275,   -1,
-   -1,   -1,   -1,   -1,  123,  305,  306,   -1,   -1,  309,
-   -1,   -1,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,
-  297,  298,   93,  300,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  272,  273,  274,  275,   -1,   41,   -1,   -1,   44,
-  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,
-   -1,   -1,  123,   58,   59,   -1,  297,  298,   63,  300,
-  301,  302,  303,  304,  305,  306,   -1,   -1,  309,   -1,
-   -1,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   91,   -1,   93,   -1,
-  272,  273,  274,  275,   -1,   41,   -1,   -1,   44,  281,
-   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,
-   -1,   -1,   58,   59,   -1,  297,  298,   63,  300,  301,
-  302,  303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,
-  312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   93,   -1,   -1,
-   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,
-   -1,   -1,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,
-  289,  290,   -1,   -1,   -1,   -1,   -1,  123,  297,  298,
-   -1,  300,  301,  302,  303,  304,  305,  306,   -1,   -1,
-  309,   -1,   -1,  312,  313,  314,   -1,   -1,   -1,   -1,
-   -1,  272,  273,  274,  275,   -1,   41,   -1,   -1,   -1,
-  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,
-   -1,   -1,   -1,   58,   59,   -1,  297,  298,   63,  300,
-  301,  302,  303,  304,  305,  306,   -1,   -1,  309,   -1,
-   -1,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   91,   -1,   93,   -1,
+  294,  295,  296,   -1,   -1,  299,   91,   -1,   93,   -1,
+   -1,   -1,   -1,   -1,  308,   41,  310,  311,   44,  257,
+  258,  259,  260,  261,   -1,  263,  264,  265,   -1,   -1,
+   -1,  269,   58,   59,   -1,   -1,   -1,   63,  123,   -1,
+   -1,   -1,  280,   -1,  282,  283,  284,  285,  286,   -1,
+   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,   -1,
+   -1,  299,   -1,   -1,   -1,   91,   -1,   93,   -1,   -1,
+  308,   -1,  310,  311,   -1,   -1,   -1,   -1,   41,   -1,
+   -1,   44,  257,  258,  259,  260,  261,   -1,  263,  264,
+  265,   -1,   -1,   -1,  269,   58,   59,  123,   -1,   -1,
+   63,   -1,   -1,   -1,   -1,  280,   -1,  282,  283,  284,
+  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,
+  295,  296,   -1,   -1,  299,   -1,   41,   -1,   91,   44,
+   93,   -1,   -1,  308,   -1,  310,  311,   -1,   -1,   -1,
+   -1,   -1,   -1,   58,   59,  289,  290,   -1,   63,   -1,
+   -1,  272,  273,  274,  275,   -1,   -1,   -1,   -1,   -1,
+  123,  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,
+  314,   -1,   -1,   -1,   -1,   -1,  297,  298,   93,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
-  275,   -1,   -1,   -1,   -1,   -1,  281,   -1,   -1,   -1,
-   -1,   -1,  287,  288,  289,  290,   -1,   -1,  123,   -1,
-   -1,   -1,  297,  298,   -1,  300,  301,  302,  303,  304,
+  275,   -1,   41,   -1,   -1,   44,  281,   -1,   -1,   -1,
+   -1,   -1,  287,  288,  289,  290,   -1,   -1,  123,   58,
+   59,   -1,  297,  298,   63,  300,  301,  302,  303,  304,
   305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,
-   -1,   41,   -1,   -1,   -1,  281,   -1,   -1,   -1,   -1,
+   -1,   -1,   91,   -1,   93,   -1,  272,  273,  274,  275,
+   -1,   41,   -1,   -1,   44,  281,   -1,   -1,   -1,   -1,
    -1,  287,  288,  289,  290,   -1,   -1,   -1,   58,   59,
    -1,  297,  298,   63,  300,  301,  302,  303,  304,  305,
   306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,
-   25,   26,   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,
-   -1,   91,   37,   93,   41,   -1,   -1,   44,   43,   44,
-   45,   58,   59,   -1,   -1,   50,   63,   -1,   -1,   -1,
-   -1,   58,   59,   -1,   -1,   -1,   63,   62,   63,   64,
-   65,   -1,   -1,  123,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   93,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   93,  272,  273,  274,
-  275,   -1,   41,   -1,   -1,   44,  281,   -1,   -1,   -1,
-   -1,  106,  287,  288,  289,  290,  123,   -1,   -1,   58,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   93,   -1,   -1,   -1,   -1,   -1,  272,
+  273,  274,  275,   -1,   -1,   -1,   -1,   -1,  281,   -1,
+   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,
+   -1,   -1,   -1,  123,  297,  298,   -1,  300,  301,  302,
+  303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,  312,
+  313,  314,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
+  275,   -1,   41,   -1,   -1,   -1,  281,   -1,   -1,   -1,
+   -1,   -1,  287,  288,  289,  290,   -1,   -1,   -1,   58,
    59,   -1,  297,  298,   63,  300,  301,  302,  303,  304,
   305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,
-   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   93,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   58,   59,   -1,   -1,   -1,   63,   -1,   -1,
-  165,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  123,   -1,   -1,   -1,   -1,   41,
-   -1,   -1,   44,   -1,  189,   91,   -1,   93,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,   -1,
-   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  272,  273,  274,  275,   -1,  123,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   91,   -1,   93,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,
+   -1,   -1,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,
+  289,  290,   -1,   -1,  123,   -1,   -1,   -1,  297,  298,
+   -1,  300,  301,  302,  303,  304,  305,  306,   -1,   -1,
+  309,   -1,   -1,  312,  313,  314,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  272,  273,  274,  275,   -1,   41,   -1,   -1,
    -1,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,
-  290,   93,   -1,   -1,   -1,   -1,   -1,  297,  298,   -1,
+  290,   -1,   -1,   -1,   58,   59,   -1,  297,  298,   63,
   300,  301,  302,  303,  304,  305,  306,   -1,   -1,  309,
-   -1,   -1,  312,  313,  314,  272,  273,  274,  275,   -1,
-   41,  123,   -1,   44,  281,  272,  273,  274,  275,   -1,
-  287,  288,  289,  290,  281,   -1,   -1,   58,   59,   -1,
-  297,  298,   63,  300,  301,  302,  303,  304,  305,  306,
-  297,  298,  309,  300,  301,  312,  313,  314,   -1,   -1,
+   -1,   -1,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,
+   41,   -1,   -1,   44,   -1,   -1,   -1,   91,   -1,   93,
+   41,   -1,   -1,   44,   -1,   -1,   -1,   58,   59,   -1,
+   -1,   -1,   63,   -1,   -1,   -1,   -1,   58,   59,   -1,
+   -1,   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,  123,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   93,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  272,  273,  274,  275,   -1,   41,   -1,
+   -1,   -1,   93,  272,  273,  274,  275,   -1,   41,   -1,
    -1,   44,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,
-  289,  290,   -1,   -1,   -1,   58,   59,   -1,  297,  298,
+  289,  290,  123,   -1,   -1,   58,   59,   -1,  297,  298,
    63,  300,  301,  302,  303,  304,  305,  306,   -1,   -1,
-  309,   -1,   -1,  312,  313,  314,  272,  273,  274,  275,
-   -1,   41,   -1,   -1,   44,  281,   -1,   -1,   -1,   -1,
-   93,  287,  288,  289,  290,   -1,   -1,   -1,   58,   59,
-   -1,  297,  298,   63,  300,  301,  302,  303,  304,  305,
-  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,
-  272,  273,  274,  275,   -1,   41,   -1,   -1,   44,  281,
-   -1,   -1,   -1,   93,   -1,  287,  288,  289,  290,   -1,
-   -1,   -1,   58,   59,   -1,  297,  298,   63,  300,  301,
-  302,  303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,
-  312,  313,  314,   -1,   -1,   -1,   -1,   -1,   41,   -1,
-   -1,   44,   -1,   -1,   -1,   -1,   -1,   93,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,
-   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  272,  273,  274,  275,   -1,   41,   -1,   -1,   44,
-  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,
-   93,   -1,   -1,   58,   59,   -1,  297,  298,   63,  300,
-  301,  302,  303,  304,  305,  306,   -1,   -1,  309,   -1,
-   -1,  312,  313,  314,   41,   -1,   -1,   44,   -1,   -1,
+  309,   -1,   -1,  312,  313,  314,   -1,   -1,   -1,   -1,
+   -1,   41,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   93,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,
+   -1,   -1,   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  123,   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,   -1,
+   -1,   91,   -1,   93,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   58,   59,   -1,   -1,   -1,   63,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
+  274,  275,   -1,  123,   -1,   -1,   -1,  281,   -1,   -1,
+   -1,   -1,   -1,  287,  288,  289,  290,   93,   -1,   -1,
+   -1,   -1,   -1,  297,  298,   -1,  300,  301,  302,  303,
+  304,  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,
+  314,  272,  273,  274,  275,   -1,   41,  123,   -1,   44,
+  281,  272,  273,  274,  275,   -1,  287,  288,  289,  290,
+  281,   -1,   -1,   58,   59,   -1,  297,  298,   63,  300,
+  301,  302,  303,  304,  305,  306,  297,  298,  309,  300,
+  301,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   93,   -1,
-   -1,   58,   59,   -1,   -1,   -1,   63,   -1,   -1,  272,
-  273,  274,  275,   -1,   -1,   -1,   -1,   -1,  281,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,
+  273,  274,  275,   -1,   41,   -1,   -1,   44,  281,   -1,
    -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,
-   -1,   -1,   -1,   -1,  297,  298,   93,  300,  301,  302,
+   -1,   58,   59,   -1,  297,  298,   63,  300,  301,  302,
   303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,  312,
   313,  314,  272,  273,  274,  275,   -1,   41,   -1,   -1,
-   44,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,
+   44,  281,   -1,   -1,   -1,   -1,   93,  287,  288,  289,
   290,   -1,   -1,   -1,   58,   59,   -1,  297,  298,   63,
   300,  301,  302,  303,  304,  305,  306,   -1,   -1,  309,
    -1,   -1,  312,  313,  314,   -1,  272,  273,  274,  275,
    -1,   41,   -1,   -1,   44,  281,   -1,   -1,   -1,   93,
    -1,  287,  288,  289,  290,   -1,   -1,   -1,   58,   59,
    -1,  297,  298,   63,  300,  301,  302,  303,  304,  305,
-  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,  272,
-  273,  274,  275,   -1,   41,   -1,   -1,   44,  281,   -1,
-   -1,   -1,   -1,   93,  287,  288,  289,  290,   -1,   -1,
-   -1,   58,   59,   -1,  297,  298,   63,  300,  301,  302,
-  303,  304,  305,  306,   -1,   -1,   -1,  272,  273,  274,
+  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,
+   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,
+   -1,   -1,   -1,   93,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   58,   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
   275,   -1,   41,   -1,   -1,   44,  281,   -1,   -1,   -1,
    -1,   -1,  287,  288,  289,  290,   93,   -1,   -1,   58,
    59,   -1,  297,  298,   63,  300,  301,  302,  303,  304,
-  305,  306,   -1,   -1,   -1,  272,  273,  274,  275,   -1,
-   41,   -1,   -1,   44,  281,   -1,   -1,   -1,   -1,   -1,
-  287,  288,  289,  290,   93,   -1,   -1,   58,   59,   -1,
-  297,  298,   63,  300,  301,  302,  303,  304,  305,  306,
-   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   93,   58,   59,   -1,   -1,   -1,   63,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
+  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,
+   41,   -1,   -1,   44,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   93,   -1,   -1,   58,   59,   -1,
+   -1,   -1,   63,   -1,   -1,  272,  273,  274,  275,   -1,
+   -1,   -1,   -1,   -1,  281,   -1,   -1,   -1,   -1,   -1,
+  287,  288,  289,  290,   -1,   -1,   -1,   -1,   -1,   -1,
+  297,  298,   93,  300,  301,  302,  303,  304,  305,  306,
+   -1,   -1,  309,   -1,   -1,  312,  313,  314,  272,  273,
   274,  275,   -1,   41,   -1,   -1,   44,  281,   -1,   -1,
-   -1,   -1,   -1,  287,  288,  289,  290,   -1,   93,   -1,
+   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,   -1,
    58,   59,   -1,  297,  298,   63,  300,  301,  302,  303,
-  304,  305,  306,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  272,  273,  274,  275,   -1,   41,   -1,   -1,
+  304,  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,
+  314,   -1,  272,  273,  274,  275,   -1,   41,   -1,   -1,
    44,  281,   -1,   -1,   -1,   93,   -1,  287,  288,  289,
   290,   -1,   -1,   -1,   58,   59,   -1,  297,  298,   63,
-  300,  301,  302,  303,  304,  305,  306,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,
+  300,  301,  302,  303,  304,  305,  306,   -1,   -1,  309,
+   -1,   -1,  312,  313,  314,  272,  273,  274,  275,   -1,
    41,   -1,   -1,   44,  281,   -1,   -1,   -1,   -1,   93,
   287,  288,  289,  290,   -1,   -1,   -1,   58,   59,   -1,
   297,  298,   63,  300,  301,  302,  303,  304,  305,  306,
@@ -956,68 +931,93 @@ short yycheck[] = {                                      13,
    -1,  272,  273,  274,  275,   -1,   41,   -1,   -1,   44,
   281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,
    93,   -1,   -1,   58,   59,   -1,  297,  298,   63,  300,
-  301,  302,  303,  304,  305,   -1,   -1,  272,  273,  274,
-  275,   -1,   41,   -1,   -1,   44,  281,   -1,   -1,   -1,
-   -1,   -1,  287,  288,   -1,  290,   -1,   -1,   93,   58,
-   59,   -1,  297,  298,   63,  300,  301,  302,  303,  304,
-  305,   -1,   -1,   -1,  272,  273,  274,  275,   -1,   41,
+  301,  302,  303,  304,  305,  306,   -1,   -1,   -1,   -1,
+   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   93,   58,
+   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,   41,
    -1,   -1,   44,  281,   -1,   -1,   -1,   -1,   -1,  287,
-  288,   -1,   -1,   -1,   93,   -1,   58,   59,   -1,  297,
-  298,   63,  300,  301,  302,  303,  304,  305,   -1,   -1,
-   91,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
+  288,  289,  290,   -1,   93,   -1,   58,   59,   -1,  297,
+  298,   63,  300,  301,  302,  303,  304,  305,  306,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
   274,  275,   -1,   41,   -1,   -1,   44,  281,   -1,   -1,
-   -1,   93,   -1,  287,  288,   -1,   41,   -1,   -1,   44,
-   58,   59,  123,  297,  298,   63,  300,  301,  302,  303,
-  304,   -1,   -1,   58,   59,   41,   -1,   -1,   44,   -1,
-   -1,  272,  273,  274,  275,   41,   -1,   -1,   44,   -1,
-  281,   -1,   58,   59,   -1,   93,  287,  288,   -1,   -1,
-   -1,   -1,   58,   59,   -1,   -1,  297,  298,   93,  300,
-  301,  302,  303,  304,   -1,   41,   -1,   -1,   44,  272,
-  273,  274,  275,   -1,   -1,   -1,   -1,   93,  281,   -1,
-   -1,   -1,   58,   59,  287,  288,   58,   93,   -1,   -1,
-   -1,   63,   -1,   -1,  297,  298,   -1,  300,  301,  302,
-  303,  304,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
-  275,   -1,   -1,   -1,   -1,   -1,  281,   93,   -1,   91,
-   -1,   -1,  287,  288,   -1,   63,   -1,   -1,   -1,   -1,
-   -1,   -1,  297,  298,   -1,  300,  301,  302,  303,  304,
+   -1,   93,   -1,  287,  288,  289,  290,   -1,   -1,   -1,
+   58,   59,   -1,  297,  298,   63,  300,  301,  302,  303,
+  304,  305,  306,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  272,  273,  274,  275,   -1,   41,   -1,   -1,   44,
+  281,   -1,   -1,   -1,   -1,   93,  287,  288,  289,  290,
+   -1,   -1,   -1,   58,   59,   -1,  297,  298,   63,  300,
+  301,  302,  303,  304,  305,  306,   -1,   -1,   -1,  272,
+  273,  274,  275,   -1,   41,   -1,   -1,   44,  281,   -1,
+   -1,   -1,   -1,   -1,  287,  288,  289,  290,   93,   -1,
+   -1,   58,   59,   -1,  297,  298,   63,  300,  301,  302,
+  303,  304,  305,  306,   -1,   -1,   -1,  272,  273,  274,
+  275,   -1,   41,   -1,   -1,   44,  281,   -1,   -1,   -1,
+   -1,   -1,  287,  288,  289,  290,   93,   -1,   -1,   58,
+   59,   -1,  297,  298,   63,  300,  301,  302,  303,  304,
+  305,   -1,   -1,  272,  273,  274,  275,   -1,   41,   -1,
+   -1,   44,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,
+   -1,   -1,   -1,   -1,   93,   58,   59,   -1,  297,  298,
+   63,  300,  301,  302,  303,  304,  305,   -1,   -1,   -1,
+  272,  273,  274,  275,   -1,   41,   -1,   -1,   44,  281,
+   -1,   -1,   -1,   -1,   -1,  287,  288,   -1,   -1,   -1,
+   93,   -1,   58,   59,   -1,  297,  298,   63,  300,  301,
+  302,  303,  304,   -1,   -1,   -1,   91,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,   41,
+   63,   -1,   44,  281,   -1,   -1,   -1,   93,   -1,  287,
+  288,   -1,   -1,   -1,   -1,   -1,   58,   59,  123,  297,
+  298,   63,  300,  301,  302,  303,  304,   -1,   91,   -1,
+   -1,   58,   -1,   -1,   -1,   -1,   63,  272,  273,  274,
+  275,   -1,   -1,   -1,   -1,   -1,  281,   -1,   -1,   -1,
+   -1,   93,  287,  288,   -1,   -1,   -1,   -1,   -1,   -1,
+  123,   -1,  297,  298,   91,  300,  301,  302,  303,  304,
+   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,
+   -1,   -1,   -1,   -1,  281,   -1,   -1,   -1,   -1,   -1,
+  287,  288,   -1,   -1,   -1,   63,  123,   -1,   -1,   -1,
+  297,  298,   -1,  300,  301,  302,  303,  304,   -1,   -1,
    -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,
-   -1,  123,  281,   91,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  281,   91,   -1,   -1,   -1,   -1,   25,   26,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  297,  298,
-   -1,  300,  301,  302,  303,  304,  287,  288,  289,  290,
-  272,  273,  274,  275,   -1,  123,   -1,   -1,   -1,  281,
-   -1,  302,  303,  304,  305,  306,   -1,   -1,  309,   -1,
-   -1,  312,  313,  314,   91,  297,  298,   -1,  300,  301,
-  302,  303,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,
-   -1,   -1,   -1,  281,   -1,   -1,  123,  272,  273,  274,
-  275,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  297,
-  298,   -1,  300,  301,  302,   -1,  272,  273,  274,  275,
-   -1,   -1,  297,  298,   30,   -1,  272,  273,  274,  275,
-   -1,   -1,   38,   -1,   -1,   -1,   42,   -1,   -1,   45,
-   -1,  297,  298,   -1,   -1,   -1,   52,   53,   54,   55,
-   56,  297,  298,   59,   60,   -1,  272,  273,  274,  275,
-   66,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  281,
+   37,  300,  301,  302,  303,  304,   43,   44,   45,  272,
+  273,  274,  275,   50,   -1,  123,   -1,   -1,  281,   91,
+   -1,   -1,   -1,   -1,   -1,   62,   63,   64,   65,   -1,
+   -1,   -1,   -1,   -1,  297,  298,   -1,  300,  301,  302,
+  303,   -1,  287,  288,  289,  290,  272,  273,  274,  275,
+   -1,  123,   -1,   -1,   -1,  281,  301,  302,  303,  304,
+  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,
+  107,  297,  298,   -1,  300,  301,  302,   -1,  281,   -1,
+   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,
+  272,  273,  274,  275,   -1,   -1,   -1,  300,  301,  302,
+  303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,  312,
+  313,  314,   -1,   -1,  281,  297,  298,   -1,  300,   -1,
+  287,  288,  289,  290,   -1,   -1,   -1,   -1,   -1,  166,
+   -1,   -1,   -1,  300,  301,  302,  303,  304,  305,  306,
+   30,   -1,  309,   -1,   -1,  312,  313,  314,   38,   -1,
+   -1,   -1,   42,  190,   -1,   45,   -1,   -1,   -1,   -1,
+   -1,   -1,   52,   53,   54,   55,   56,   -1,   -1,   59,
+   60,   -1,   -1,  281,   -1,   -1,   66,   -1,   -1,  287,
+  288,  289,  290,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  301,  302,  303,  304,  305,  306,   -1,
+   -1,  309,   -1,   93,  312,  313,  314,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,
-   -1,  297,  298,   -1,   -1,   -1,   92,   -1,  300,  301,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   302,  303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,
-  312,  313,  314,  281,   -1,   -1,   -1,   -1,   -1,  287,
-  288,  289,  290,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  300,  301,  302,  303,  304,  305,  306,   -1,
-   -1,  309,   -1,   -1,  312,  313,  314,   -1,   -1,   -1,
-   -1,   -1,   -1,  149,  150,  151,  152,  153,  154,  155,
-  156,  157,  158,  159,  160,  161,  162,   -1,   -1,   -1,
-  287,  288,  289,  290,   -1,   -1,   -1,   -1,  174,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,  303,  304,  305,  306,
-   -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,   -1,
+  312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  150,  151,  152,  153,  154,  155,  156,  157,  158,  159,
+  160,  161,  162,  163,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,  175,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  250,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  281,
+   -1,   -1,  252,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  283,
 };
 #define YYFINAL 1
 #ifndef YYDEBUG
@@ -1094,14 +1094,18 @@ char *yyrule[] = {
 "decl : use",
 "format : FORMAT startsub WORD block",
 "format : FORMAT startsub block",
-"subrout : SUB startsub WORD proto block",
-"subrout : SUB startsub WORD proto ';'",
+"subrout : SUB startsub subname proto subbody",
+"startsub :",
+"startanonsub :",
+"subname : WORD",
 "proto :",
 "proto : THING",
-"startsub :",
+"subbody : block",
+"subbody : ';'",
 "package : PACKAGE WORD ';'",
 "package : PACKAGE ';'",
-"use : USE startsub WORD WORD listexpr ';'",
+"$$2 :",
+"use : USE startsub $$2 WORD WORD listexpr ';'",
 "expr : expr ANDOP expr",
 "expr : expr OROP expr",
 "expr : argexpr",
@@ -1115,7 +1119,8 @@ char *yyrule[] = {
 "listop : FUNCMETH indirob '(' listexprcom ')'",
 "listop : LSTOP listexpr",
 "listop : FUNC '(' listexprcom ')'",
-"listop : LSTOPSUB startsub block listexpr",
+"$$3 :",
+"listop : LSTOPSUB startanonsub block $$3 listexpr",
 "method : METHOD",
 "method : scalar",
 "term : term ASSIGNOP term",
@@ -1148,7 +1153,7 @@ char *yyrule[] = {
 "term : '[' ']'",
 "term : HASHBRACK expr ';' '}'",
 "term : HASHBRACK ';' '}'",
-"term : ANONSUB startsub proto block",
+"term : ANONSUB startanonsub proto block",
 "term : scalar",
 "term : star '{' expr ';' '}'",
 "term : star",
@@ -1232,9 +1237,9 @@ int yyerrflag;
 int yychar;
 YYSTYPE yyval;
 YYSTYPE yylval;
-#line 602 "perly.y"
+#line 619 "perly.y"
  /* PROGRAM */
-#line 1308 "perly.c"
+#line 1313 "perly.c"
 #define YYABORT goto yyabort
 #define YYACCEPT goto yyaccept
 #define YYERROR goto yyerrlab
@@ -1459,7 +1464,7 @@ yyreduce:
     switch (yyn)
     {
 case 1:
-#line 85 "perly.y"
+#line 86 "perly.y"
 {
 #if defined(YYDEBUG) && defined(DEBUGGING)
                    yydebug = (debug & 1);
@@ -1468,50 +1473,50 @@ case 1:
                }
 break;
 case 2:
-#line 92 "perly.y"
+#line 93 "perly.y"
 { newPROG(yyvsp[0].opval); }
 break;
 case 3:
-#line 96 "perly.y"
+#line 97 "perly.y"
 { if (copline > (line_t)yyvsp[-3].ival)
                              copline = yyvsp[-3].ival;
                          yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); }
 break;
 case 4:
-#line 102 "perly.y"
+#line 103 "perly.y"
 { yyval.ival = block_start(TRUE); }
 break;
 case 5:
-#line 106 "perly.y"
+#line 107 "perly.y"
 { if (copline > (line_t)yyvsp[-3].ival)
                              copline = yyvsp[-3].ival;
                          yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); }
 break;
 case 6:
-#line 112 "perly.y"
+#line 113 "perly.y"
 { yyval.ival = block_start(FALSE); }
 break;
 case 7:
-#line 116 "perly.y"
+#line 117 "perly.y"
 { yyval.opval = Nullop; }
 break;
 case 8:
-#line 118 "perly.y"
+#line 119 "perly.y"
 { yyval.opval = yyvsp[-1].opval; }
 break;
 case 9:
-#line 120 "perly.y"
+#line 121 "perly.y"
 {   yyval.opval = append_list(OP_LINESEQ,
                                (LISTOP*)yyvsp[-1].opval, (LISTOP*)yyvsp[0].opval);
                            pad_reset_pending = TRUE;
                            if (yyvsp[-1].opval && yyvsp[0].opval) hints |= HINT_BLOCK_SCOPE; }
 break;
 case 10:
-#line 127 "perly.y"
+#line 128 "perly.y"
 { yyval.opval = newSTATEOP(0, yyvsp[-1].pval, yyvsp[0].opval); }
 break;
 case 12:
-#line 130 "perly.y"
+#line 131 "perly.y"
 { if (yyvsp[-1].pval != Nullch) {
                              yyval.opval = newSTATEOP(0, yyvsp[-1].pval, newOP(OP_NULL, 0));
                            }
@@ -1522,71 +1527,71 @@ case 12:
                            expect = XSTATE; }
 break;
 case 13:
-#line 139 "perly.y"
+#line 140 "perly.y"
 { yyval.opval = newSTATEOP(0, yyvsp[-2].pval, yyvsp[-1].opval);
                          expect = XSTATE; }
 break;
 case 14:
-#line 144 "perly.y"
+#line 145 "perly.y"
 { yyval.opval = Nullop; }
 break;
 case 15:
-#line 146 "perly.y"
+#line 147 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
 case 16:
-#line 148 "perly.y"
+#line 149 "perly.y"
 { yyval.opval = newLOGOP(OP_AND, 0, yyvsp[0].opval, yyvsp[-2].opval); }
 break;
 case 17:
-#line 150 "perly.y"
+#line 151 "perly.y"
 { yyval.opval = newLOGOP(OP_OR, 0, yyvsp[0].opval, yyvsp[-2].opval); }
 break;
 case 18:
-#line 152 "perly.y"
+#line 153 "perly.y"
 { yyval.opval = newLOOPOP(OPf_PARENS, 1, scalar(yyvsp[0].opval), yyvsp[-2].opval); }
 break;
 case 19:
-#line 154 "perly.y"
+#line 155 "perly.y"
 { yyval.opval = newLOOPOP(OPf_PARENS, 1, yyvsp[0].opval, yyvsp[-2].opval);}
 break;
 case 20:
-#line 158 "perly.y"
+#line 159 "perly.y"
 { yyval.opval = Nullop; }
 break;
 case 21:
-#line 160 "perly.y"
+#line 161 "perly.y"
 { yyval.opval = scope(yyvsp[0].opval); }
 break;
 case 22:
-#line 162 "perly.y"
+#line 163 "perly.y"
 { copline = yyvsp[-5].ival;
                            yyval.opval = newSTATEOP(0, Nullch,
                                   newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval));
                            hints |= HINT_BLOCK_SCOPE; }
 break;
 case 23:
-#line 169 "perly.y"
+#line 170 "perly.y"
 { copline = yyvsp[-6].ival;
                            yyval.opval = block_end(yyvsp[-4].ival,
                                   newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); }
 break;
 case 24:
-#line 173 "perly.y"
+#line 174 "perly.y"
 { copline = yyvsp[-6].ival;
                            yyval.opval = block_end(yyvsp[-4].ival,
                                   newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); }
 break;
 case 25:
-#line 179 "perly.y"
+#line 180 "perly.y"
 { yyval.opval = Nullop; }
 break;
 case 26:
-#line 181 "perly.y"
+#line 182 "perly.y"
 { yyval.opval = scope(yyvsp[0].opval); }
 break;
 case 27:
-#line 185 "perly.y"
+#line 186 "perly.y"
 { copline = yyvsp[-6].ival;
                            yyval.opval = block_end(yyvsp[-4].ival,
                                   newSTATEOP(0, yyvsp[-7].pval,
@@ -1594,7 +1599,7 @@ case 27:
                                                yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); }
 break;
 case 28:
-#line 191 "perly.y"
+#line 192 "perly.y"
 { copline = yyvsp[-6].ival;
                            yyval.opval = block_end(yyvsp[-4].ival,
                                   newSTATEOP(0, yyvsp[-7].pval,
@@ -1602,23 +1607,23 @@ case 28:
                                                yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); }
 break;
 case 29:
-#line 197 "perly.y"
+#line 198 "perly.y"
 { yyval.opval = block_end(yyvsp[-6].ival,
                                 newFOROP(0, yyvsp[-9].pval, yyvsp[-8].ival, yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
 break;
 case 30:
-#line 200 "perly.y"
+#line 201 "perly.y"
 { yyval.opval = block_end(yyvsp[-4].ival,
                                 newFOROP(0, yyvsp[-8].pval, yyvsp[-7].ival, mod(yyvsp[-6].opval, OP_ENTERLOOP),
                                          yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
 break;
 case 31:
-#line 204 "perly.y"
+#line 205 "perly.y"
 { yyval.opval = block_end(yyvsp[-4].ival,
                                 newFOROP(0, yyvsp[-7].pval, yyvsp[-6].ival, Nullop, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
 break;
 case 32:
-#line 208 "perly.y"
+#line 209 "perly.y"
 { copline = yyvsp[-9].ival;
                            yyval.opval = block_end(yyvsp[-7].ival,
                                   append_elem(OP_LINESEQ, scalar(yyvsp[-6].opval),
@@ -1628,364 +1633,387 @@ case 32:
                                                  yyvsp[0].opval, scalar(yyvsp[-2].opval))))); }
 break;
 case 33:
-#line 216 "perly.y"
+#line 217 "perly.y"
 { yyval.opval = newSTATEOP(0,
                                yyvsp[-2].pval, newWHILEOP(0, 1, (LOOP*)Nullop,
                                        Nullop, yyvsp[-1].opval, yyvsp[0].opval)); }
 break;
 case 34:
-#line 222 "perly.y"
+#line 223 "perly.y"
 { yyval.opval = Nullop; }
 break;
 case 36:
-#line 227 "perly.y"
+#line 228 "perly.y"
 { (void)scan_num("1"); yyval.opval = yylval.opval; }
 break;
 case 38:
-#line 232 "perly.y"
+#line 233 "perly.y"
 { yyval.opval = invert(scalar(yyvsp[0].opval)); }
 break;
 case 39:
-#line 236 "perly.y"
+#line 237 "perly.y"
 { yyval.opval = yyvsp[0].opval; intro_my(); }
 break;
 case 40:
-#line 240 "perly.y"
+#line 241 "perly.y"
 { yyval.opval = yyvsp[0].opval; intro_my(); }
 break;
 case 41:
-#line 244 "perly.y"
+#line 245 "perly.y"
 { yyval.opval = yyvsp[0].opval; intro_my(); }
 break;
 case 42:
-#line 248 "perly.y"
+#line 249 "perly.y"
 { yyval.opval = yyvsp[0].opval; intro_my(); }
 break;
 case 43:
-#line 252 "perly.y"
+#line 253 "perly.y"
 { yyval.pval = Nullch; }
 break;
 case 45:
-#line 257 "perly.y"
+#line 258 "perly.y"
 { yyval.ival = 0; }
 break;
 case 46:
-#line 259 "perly.y"
+#line 260 "perly.y"
 { yyval.ival = 0; }
 break;
 case 47:
-#line 261 "perly.y"
+#line 262 "perly.y"
 { yyval.ival = 0; }
 break;
 case 48:
-#line 263 "perly.y"
+#line 264 "perly.y"
 { yyval.ival = 0; }
 break;
 case 49:
-#line 267 "perly.y"
+#line 268 "perly.y"
 { newFORM(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
 break;
 case 50:
-#line 269 "perly.y"
+#line 270 "perly.y"
 { newFORM(yyvsp[-1].ival, Nullop, yyvsp[0].opval); }
 break;
 case 51:
-#line 273 "perly.y"
+#line 274 "perly.y"
 { newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
 break;
 case 52:
-#line 275 "perly.y"
-{ newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, Nullop); expect = XSTATE; }
+#line 278 "perly.y"
+{ yyval.ival = start_subparse(); }
 break;
 case 53:
-#line 279 "perly.y"
-{ yyval.opval = Nullop; }
+#line 282 "perly.y"
+{ yyval.ival = start_subparse();
+                         CvANON_on(compcv); }
 break;
-case 55:
-#line 284 "perly.y"
-{ yyval.ival = start_subparse(); }
+case 54:
+#line 286 "perly.y"
+{ char *name = SvPVx(((SVOP*)yyvsp[0].opval)->op_sv, na);
+                         if (strEQ(name, "BEGIN") || strEQ(name, "END"))
+                             CvUNIQUE_on(compcv);
+                         yyval.opval = yyvsp[0].opval; }
 break;
-case 56:
-#line 288 "perly.y"
-{ package(yyvsp[-1].opval); }
+case 55:
+#line 293 "perly.y"
+{ yyval.opval = Nullop; }
 break;
 case 57:
-#line 290 "perly.y"
-{ package(Nullop); }
+#line 297 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
 break;
 case 58:
-#line 294 "perly.y"
-{ utilize(yyvsp[-5].ival, yyvsp[-4].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval); }
+#line 298 "perly.y"
+{ yyval.opval = Nullop; expect = XSTATE; }
 break;
 case 59:
-#line 298 "perly.y"
-{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); }
+#line 302 "perly.y"
+{ package(yyvsp[-1].opval); }
 break;
 case 60:
-#line 300 "perly.y"
-{ yyval.opval = newLOGOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, yyvsp[0].opval); }
+#line 304 "perly.y"
+{ package(Nullop); }
+break;
+case 61:
+#line 308 "perly.y"
+{ CvUNIQUE_on(compcv); /* It's a BEGIN {} */ }
 break;
 case 62:
-#line 305 "perly.y"
-{ yyval.opval = yyvsp[-1].opval; }
+#line 310 "perly.y"
+{ utilize(yyvsp[-6].ival, yyvsp[-5].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval); }
 break;
 case 63:
-#line 307 "perly.y"
+#line 314 "perly.y"
+{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); }
+break;
+case 64:
+#line 316 "perly.y"
+{ yyval.opval = newLOGOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, yyvsp[0].opval); }
+break;
+case 66:
+#line 321 "perly.y"
+{ yyval.opval = yyvsp[-1].opval; }
+break;
+case 67:
+#line 323 "perly.y"
 { yyval.opval = append_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 65:
-#line 312 "perly.y"
+case 69:
+#line 328 "perly.y"
 { yyval.opval = convert(yyvsp[-2].ival, OPf_STACKED,
                                prepend_elem(OP_LIST, newGVREF(yyvsp[-2].ival,yyvsp[-1].opval), yyvsp[0].opval) ); }
 break;
-case 66:
-#line 315 "perly.y"
+case 70:
+#line 331 "perly.y"
 { yyval.opval = convert(yyvsp[-4].ival, OPf_STACKED,
                                prepend_elem(OP_LIST, newGVREF(yyvsp[-4].ival,yyvsp[-2].opval), yyvsp[-1].opval) ); }
 break;
-case 67:
-#line 318 "perly.y"
+case 71:
+#line 334 "perly.y"
 { yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST,
                                    prepend_elem(OP_LIST, scalar(yyvsp[-5].opval), yyvsp[-1].opval),
                                    newUNOP(OP_METHOD, 0, yyvsp[-3].opval))); }
 break;
-case 68:
-#line 323 "perly.y"
+case 72:
+#line 339 "perly.y"
 { yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST,
                                    prepend_elem(OP_LIST, yyvsp[-1].opval, yyvsp[0].opval),
                                    newUNOP(OP_METHOD, 0, yyvsp[-2].opval))); }
 break;
-case 69:
-#line 328 "perly.y"
+case 73:
+#line 344 "perly.y"
 { yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST,
                                    prepend_elem(OP_LIST, yyvsp[-3].opval, yyvsp[-1].opval),
                                    newUNOP(OP_METHOD, 0, yyvsp[-4].opval))); }
 break;
-case 70:
-#line 333 "perly.y"
+case 74:
+#line 349 "perly.y"
 { yyval.opval = convert(yyvsp[-1].ival, 0, yyvsp[0].opval); }
 break;
-case 71:
-#line 335 "perly.y"
+case 75:
+#line 351 "perly.y"
 { yyval.opval = convert(yyvsp[-3].ival, 0, yyvsp[-1].opval); }
 break;
-case 72:
-#line 337 "perly.y"
+case 76:
+#line 353 "perly.y"
+{ yyvsp[0].opval = newANONSUB(yyvsp[-1].ival, 0, yyvsp[0].opval); }
+break;
+case 77:
+#line 355 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                           append_elem(OP_LIST,
-                             prepend_elem(OP_LIST, newANONSUB(yyvsp[-2].ival, 0, yyvsp[-1].opval), yyvsp[0].opval),
-                             yyvsp[-3].opval)); }
+                                append_elem(OP_LIST,
+                                  prepend_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval), yyvsp[-4].opval)); }
 break;
-case 75:
-#line 348 "perly.y"
+case 80:
+#line 365 "perly.y"
 { yyval.opval = newASSIGNOP(OPf_STACKED, yyvsp[-2].opval, yyvsp[-1].ival, yyvsp[0].opval); }
 break;
-case 76:
-#line 350 "perly.y"
+case 81:
+#line 367 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 77:
-#line 352 "perly.y"
+case 82:
+#line 369 "perly.y"
 {   if (yyvsp[-1].ival != OP_REPEAT)
                                scalar(yyvsp[-2].opval);
                            yyval.opval = newBINOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, scalar(yyvsp[0].opval)); }
 break;
-case 78:
-#line 356 "perly.y"
+case 83:
+#line 373 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 79:
-#line 358 "perly.y"
+case 84:
+#line 375 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 80:
-#line 360 "perly.y"
+case 85:
+#line 377 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 81:
-#line 362 "perly.y"
+case 86:
+#line 379 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 82:
-#line 364 "perly.y"
+case 87:
+#line 381 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 83:
-#line 366 "perly.y"
+case 88:
+#line 383 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 84:
-#line 368 "perly.y"
+case 89:
+#line 385 "perly.y"
 { yyval.opval = newRANGE(yyvsp[-1].ival, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval));}
 break;
-case 85:
-#line 370 "perly.y"
+case 90:
+#line 387 "perly.y"
 { yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 86:
-#line 372 "perly.y"
+case 91:
+#line 389 "perly.y"
 { yyval.opval = newLOGOP(OP_OR, 0, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 87:
-#line 374 "perly.y"
+case 92:
+#line 391 "perly.y"
 { yyval.opval = newCONDOP(0, yyvsp[-4].opval, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 88:
-#line 376 "perly.y"
+case 93:
+#line 393 "perly.y"
 { yyval.opval = bind_match(yyvsp[-1].ival, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 89:
-#line 379 "perly.y"
+case 94:
+#line 396 "perly.y"
 { yyval.opval = newUNOP(OP_NEGATE, 0, scalar(yyvsp[0].opval)); }
 break;
-case 90:
-#line 381 "perly.y"
+case 95:
+#line 398 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 91:
-#line 383 "perly.y"
+case 96:
+#line 400 "perly.y"
 { yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); }
 break;
-case 92:
-#line 385 "perly.y"
+case 97:
+#line 402 "perly.y"
 { yyval.opval = newUNOP(OP_COMPLEMENT, 0, scalar(yyvsp[0].opval));}
 break;
-case 93:
-#line 387 "perly.y"
+case 98:
+#line 404 "perly.y"
 { yyval.opval = newUNOP(OP_REFGEN, 0, mod(yyvsp[0].opval,OP_REFGEN)); }
 break;
-case 94:
-#line 389 "perly.y"
+case 99:
+#line 406 "perly.y"
 { yyval.opval = newUNOP(OP_POSTINC, 0,
                                        mod(scalar(yyvsp[-1].opval), OP_POSTINC)); }
 break;
-case 95:
-#line 392 "perly.y"
+case 100:
+#line 409 "perly.y"
 { yyval.opval = newUNOP(OP_POSTDEC, 0,
                                        mod(scalar(yyvsp[-1].opval), OP_POSTDEC)); }
 break;
-case 96:
-#line 395 "perly.y"
+case 101:
+#line 412 "perly.y"
 { yyval.opval = newUNOP(OP_PREINC, 0,
                                        mod(scalar(yyvsp[0].opval), OP_PREINC)); }
 break;
-case 97:
-#line 398 "perly.y"
+case 102:
+#line 415 "perly.y"
 { yyval.opval = newUNOP(OP_PREDEC, 0,
                                        mod(scalar(yyvsp[0].opval), OP_PREDEC)); }
 break;
-case 98:
-#line 401 "perly.y"
+case 103:
+#line 418 "perly.y"
 { yyval.opval = localize(yyvsp[0].opval,yyvsp[-1].ival); }
 break;
-case 99:
-#line 403 "perly.y"
+case 104:
+#line 420 "perly.y"
 { yyval.opval = sawparens(yyvsp[-1].opval); }
 break;
-case 100:
-#line 405 "perly.y"
+case 105:
+#line 422 "perly.y"
 { yyval.opval = sawparens(newNULLLIST()); }
 break;
-case 101:
-#line 407 "perly.y"
+case 106:
+#line 424 "perly.y"
 { yyval.opval = newANONLIST(yyvsp[-1].opval); }
 break;
-case 102:
-#line 409 "perly.y"
+case 107:
+#line 426 "perly.y"
 { yyval.opval = newANONLIST(Nullop); }
 break;
-case 103:
-#line 411 "perly.y"
+case 108:
+#line 428 "perly.y"
 { yyval.opval = newANONHASH(yyvsp[-2].opval); }
 break;
-case 104:
-#line 413 "perly.y"
+case 109:
+#line 430 "perly.y"
 { yyval.opval = newANONHASH(Nullop); }
 break;
-case 105:
-#line 415 "perly.y"
+case 110:
+#line 432 "perly.y"
 { yyval.opval = newANONSUB(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
 break;
-case 106:
-#line 417 "perly.y"
+case 111:
+#line 434 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 107:
-#line 419 "perly.y"
+case 112:
+#line 436 "perly.y"
 { yyval.opval = newBINOP(OP_GELEM, 0, newGVREF(0,yyvsp[-4].opval), yyvsp[-2].opval); }
 break;
-case 108:
-#line 421 "perly.y"
+case 113:
+#line 438 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 109:
-#line 423 "perly.y"
+case 114:
+#line 440 "perly.y"
 { yyval.opval = newBINOP(OP_AELEM, 0, oopsAV(yyvsp[-3].opval), scalar(yyvsp[-1].opval)); }
 break;
-case 110:
-#line 425 "perly.y"
+case 115:
+#line 442 "perly.y"
 { yyval.opval = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF(yyvsp[-4].opval),OP_RV2AV),
                                        scalar(yyvsp[-1].opval));}
 break;
-case 111:
-#line 429 "perly.y"
+case 116:
+#line 446 "perly.y"
 { assertref(yyvsp[-3].opval); yyval.opval = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF(yyvsp[-3].opval),OP_RV2AV),
                                        scalar(yyvsp[-1].opval));}
 break;
-case 112:
-#line 433 "perly.y"
+case 117:
+#line 450 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 113:
-#line 435 "perly.y"
+case 118:
+#line 452 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 114:
-#line 437 "perly.y"
+case 119:
+#line 454 "perly.y"
 { yyval.opval = newUNOP(OP_AV2ARYLEN, 0, ref(yyvsp[0].opval, OP_AV2ARYLEN));}
 break;
-case 115:
-#line 439 "perly.y"
+case 120:
+#line 456 "perly.y"
 { yyval.opval = newBINOP(OP_HELEM, 0, oopsHV(yyvsp[-4].opval), jmaybe(yyvsp[-2].opval));
                            expect = XOPERATOR; }
 break;
-case 116:
-#line 442 "perly.y"
+case 121:
+#line 459 "perly.y"
 { yyval.opval = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF(yyvsp[-5].opval),OP_RV2HV),
                                        jmaybe(yyvsp[-2].opval));
                            expect = XOPERATOR; }
 break;
-case 117:
-#line 447 "perly.y"
+case 122:
+#line 464 "perly.y"
 { assertref(yyvsp[-4].opval); yyval.opval = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF(yyvsp[-4].opval),OP_RV2HV),
                                        jmaybe(yyvsp[-2].opval));
                            expect = XOPERATOR; }
 break;
-case 118:
-#line 452 "perly.y"
+case 123:
+#line 469 "perly.y"
 { yyval.opval = newSLICEOP(0, yyvsp[-1].opval, yyvsp[-4].opval); }
 break;
-case 119:
-#line 454 "perly.y"
+case 124:
+#line 471 "perly.y"
 { yyval.opval = newSLICEOP(0, yyvsp[-1].opval, Nullop); }
 break;
-case 120:
-#line 456 "perly.y"
+case 125:
+#line 473 "perly.y"
 { yyval.opval = prepend_elem(OP_ASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_ASLICE, 0,
                                        list(yyvsp[-1].opval),
                                        ref(yyvsp[-3].opval, OP_ASLICE))); }
 break;
-case 121:
-#line 462 "perly.y"
+case 126:
+#line 479 "perly.y"
 { yyval.opval = prepend_elem(OP_HSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_HSLICE, 0,
@@ -1993,38 +2021,38 @@ case 121:
                                        ref(oopsHV(yyvsp[-4].opval), OP_HSLICE)));
                            expect = XOPERATOR; }
 break;
-case 122:
-#line 469 "perly.y"
+case 127:
+#line 486 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 123:
-#line 471 "perly.y"
+case 128:
+#line 488 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, 0, scalar(yyvsp[0].opval)); }
 break;
-case 124:
-#line 473 "perly.y"
+case 129:
+#line 490 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar(yyvsp[-2].opval)); }
 break;
-case 125:
-#line 475 "perly.y"
+case 130:
+#line 492 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            append_elem(OP_LIST, yyvsp[-1].opval, scalar(yyvsp[-3].opval))); }
 break;
-case 126:
-#line 478 "perly.y"
+case 131:
+#line 495 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); }
 break;
-case 127:
-#line 481 "perly.y"
+case 132:
+#line 498 "perly.y"
 { yyval.opval = newUNOP(OP_DOFILE, 0, scalar(yyvsp[0].opval)); }
 break;
-case 128:
-#line 483 "perly.y"
+case 133:
+#line 500 "perly.y"
 { yyval.opval = newUNOP(OP_NULL, OPf_SPECIAL, scope(yyvsp[0].opval)); }
 break;
-case 129:
-#line 485 "perly.y"
+case 134:
+#line 502 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB,
                            OPf_SPECIAL|OPf_STACKED,
                            prepend_elem(OP_LIST,
@@ -2033,8 +2061,8 @@ case 129:
                                    scalar(yyvsp[-2].opval)
                                )),Nullop)); dep();}
 break;
-case 130:
-#line 493 "perly.y"
+case 135:
+#line 510 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB,
                            OPf_SPECIAL|OPf_STACKED,
                            append_elem(OP_LIST,
@@ -2044,151 +2072,151 @@ case 130:
                                    scalar(yyvsp[-3].opval)
                                )))); dep();}
 break;
-case 131:
-#line 502 "perly.y"
+case 136:
+#line 519 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
                            prepend_elem(OP_LIST,
                                scalar(newCVREF(0,scalar(yyvsp[-2].opval))), Nullop)); dep();}
 break;
-case 132:
-#line 506 "perly.y"
+case 137:
+#line 523 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
                            prepend_elem(OP_LIST,
                                yyvsp[-1].opval,
                                scalar(newCVREF(0,scalar(yyvsp[-3].opval))))); dep();}
 break;
-case 133:
-#line 511 "perly.y"
+case 138:
+#line 528 "perly.y"
 { yyval.opval = newOP(yyvsp[0].ival, OPf_SPECIAL);
                            hints |= HINT_BLOCK_SCOPE; }
 break;
-case 134:
-#line 514 "perly.y"
+case 139:
+#line 531 "perly.y"
 { yyval.opval = newLOOPEX(yyvsp[-1].ival,yyvsp[0].opval); }
 break;
-case 135:
-#line 516 "perly.y"
+case 140:
+#line 533 "perly.y"
 { yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); }
 break;
-case 136:
-#line 518 "perly.y"
+case 141:
+#line 535 "perly.y"
 { yyval.opval = newOP(yyvsp[0].ival, 0); }
 break;
-case 137:
-#line 520 "perly.y"
+case 142:
+#line 537 "perly.y"
 { yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); }
 break;
-case 138:
-#line 522 "perly.y"
+case 143:
+#line 539 "perly.y"
 { yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); }
 break;
-case 139:
-#line 524 "perly.y"
+case 144:
+#line 541 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); }
 break;
-case 140:
-#line 527 "perly.y"
+case 145:
+#line 544 "perly.y"
 { yyval.opval = newOP(yyvsp[0].ival, 0); }
 break;
-case 141:
-#line 529 "perly.y"
+case 146:
+#line 546 "perly.y"
 { yyval.opval = newOP(yyvsp[-2].ival, 0); }
 break;
-case 142:
-#line 531 "perly.y"
-{ yyval.opval = newUNOP(OP_ENTERSUB, 0,
+case 147:
+#line 548 "perly.y"
+{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                scalar(yyvsp[0].opval)); }
 break;
-case 143:
-#line 534 "perly.y"
+case 148:
+#line 551 "perly.y"
 { yyval.opval = newOP(yyvsp[-2].ival, OPf_SPECIAL); }
 break;
-case 144:
-#line 536 "perly.y"
+case 149:
+#line 553 "perly.y"
 { yyval.opval = newUNOP(yyvsp[-3].ival, 0, yyvsp[-1].opval); }
 break;
-case 145:
-#line 538 "perly.y"
+case 150:
+#line 555 "perly.y"
 { yyval.opval = pmruntime(yyvsp[-3].opval, yyvsp[-1].opval, Nullop); }
 break;
-case 146:
-#line 540 "perly.y"
+case 151:
+#line 557 "perly.y"
 { yyval.opval = pmruntime(yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval); }
 break;
-case 149:
-#line 546 "perly.y"
+case 154:
+#line 563 "perly.y"
 { yyval.opval = Nullop; }
 break;
-case 150:
-#line 548 "perly.y"
+case 155:
+#line 565 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 151:
-#line 552 "perly.y"
+case 156:
+#line 569 "perly.y"
 { yyval.opval = Nullop; }
 break;
-case 152:
-#line 554 "perly.y"
+case 157:
+#line 571 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 153:
-#line 556 "perly.y"
+case 158:
+#line 573 "perly.y"
 { yyval.opval = yyvsp[-1].opval; }
 break;
-case 154:
-#line 559 "perly.y"
+case 159:
+#line 576 "perly.y"
 { yyval.ival = 0; }
 break;
-case 155:
-#line 560 "perly.y"
+case 160:
+#line 577 "perly.y"
 { yyval.ival = 1; }
 break;
-case 156:
-#line 564 "perly.y"
+case 161:
+#line 581 "perly.y"
 { in_my = 0; yyval.opval = my(yyvsp[0].opval); }
 break;
-case 157:
-#line 568 "perly.y"
+case 162:
+#line 585 "perly.y"
 { yyval.opval = newCVREF(yyvsp[-1].ival,yyvsp[0].opval); }
 break;
-case 158:
-#line 572 "perly.y"
+case 163:
+#line 589 "perly.y"
 { yyval.opval = newSVREF(yyvsp[0].opval); }
 break;
-case 159:
-#line 576 "perly.y"
+case 164:
+#line 593 "perly.y"
 { yyval.opval = newAVREF(yyvsp[0].opval); }
 break;
-case 160:
-#line 580 "perly.y"
+case 165:
+#line 597 "perly.y"
 { yyval.opval = newHVREF(yyvsp[0].opval); }
 break;
-case 161:
-#line 584 "perly.y"
+case 166:
+#line 601 "perly.y"
 { yyval.opval = newAVREF(yyvsp[0].opval); }
 break;
-case 162:
-#line 588 "perly.y"
+case 167:
+#line 605 "perly.y"
 { yyval.opval = newGVREF(0,yyvsp[0].opval); }
 break;
-case 163:
-#line 592 "perly.y"
+case 168:
+#line 609 "perly.y"
 { yyval.opval = scalar(yyvsp[0].opval); }
 break;
-case 164:
-#line 594 "perly.y"
+case 169:
+#line 611 "perly.y"
 { yyval.opval = scalar(yyvsp[0].opval);  }
 break;
-case 165:
-#line 596 "perly.y"
+case 170:
+#line 613 "perly.y"
 { yyval.opval = scope(yyvsp[0].opval); }
 break;
-case 166:
-#line 599 "perly.y"
+case 171:
+#line 616 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-#line 2178 "perly.c"
+#line 2206 "perly.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
index dae42d3..dea42d1 100644 (file)
@@ -78,7 +78,7 @@ Index: perly.c
   #define YYERRCODE 256
   short yylhs[] = {                                        -1,
 ***************
-*** 1296,1306 ****
+*** 1301,1311 ****
   int yyerrflag;
   int yychar;
 - short *yyssp;
@@ -88,12 +88,12 @@ Index: perly.c
 - short yyss[YYSTACKSIZE];
 - YYSTYPE yyvs[YYSTACKSIZE];
 - #define yystacksize YYSTACKSIZE
-  #line 602 "perly.y"
+  #line 619 "perly.y"
    /* PROGRAM */
---- 1231,1236 ----
+--- 1236,1241 ----
 ***************
-*** 1309,1320 ****
---- 1239,1295 ----
+*** 1314,1325 ****
+--- 1244,1300 ----
   #define YYACCEPT goto yyaccept
   #define YYERROR goto yyerrlab
 + 
@@ -152,8 +152,8 @@ Index: perly.c
       if (yys = getenv("YYDEBUG"))
       {
 ***************
-*** 1329,1332 ****
---- 1304,1315 ----
+*** 1334,1337 ****
+--- 1309,1320 ----
       yychar = (-1);
   
 +     /*
@@ -167,20 +167,20 @@ Index: perly.c
       yyssp = yyss;
       yyvsp = yyvs;
 ***************
-*** 1344,1348 ****
+*** 1349,1353 ****
               if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
               if (!yys) yys = "illegal-symbol";
 !             printf("yydebug: state %d, reading %d (%s)\n", yystate,
                       yychar, yys);
           }
---- 1327,1331 ----
+--- 1332,1336 ----
               if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
               if (!yys) yys = "illegal-symbol";
 !             fprintf(stderr, "yydebug: state %d, reading %d (%s)\n", yystate,
                       yychar, yys);
           }
 ***************
-*** 1354,1363 ****
+*** 1359,1368 ****
   #if YYDEBUG
           if (yydebug)
 !             printf("yydebug: state %d, shifting to state %d\n",
@@ -191,7 +191,7 @@ Index: perly.c
 !             goto yyoverflow;
           }
           *++yyssp = yystate = yytable[yyn];
---- 1337,1360 ----
+--- 1342,1365 ----
   #if YYDEBUG
           if (yydebug)
 !             fprintf(stderr, "yydebug: state %d, shifting to state %d\n",
@@ -217,7 +217,7 @@ Index: perly.c
           }
           *++yyssp = yystate = yytable[yyn];
 ***************
-*** 1395,1404 ****
+*** 1400,1409 ****
   #if YYDEBUG
                   if (yydebug)
 !                     printf("yydebug: state %d, error recovery shifting\
@@ -228,7 +228,7 @@ Index: perly.c
 !                     goto yyoverflow;
                   }
                   *++yyssp = yystate = yytable[yyn];
---- 1392,1416 ----
+--- 1397,1421 ----
   #if YYDEBUG
                   if (yydebug)
 !                     fprintf(stderr,
@@ -255,14 +255,14 @@ Index: perly.c
                   }
                   *++yyssp = yystate = yytable[yyn];
 ***************
-*** 1410,1415 ****
+*** 1415,1420 ****
   #if YYDEBUG
                   if (yydebug)
 !                     printf("yydebug: error recovery discarding state %d\n",
 !                             *yyssp);
   #endif
                   if (yyssp <= yyss) goto yyabort;
---- 1422,1428 ----
+--- 1427,1433 ----
   #if YYDEBUG
                   if (yydebug)
 !                     fprintf(stderr,
@@ -271,14 +271,14 @@ Index: perly.c
   #endif
                   if (yyssp <= yyss) goto yyabort;
 ***************
-*** 1428,1433 ****
+*** 1433,1438 ****
               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
---- 1441,1447 ----
+--- 1446,1452 ----
               if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
               if (!yys) yys = "illegal-symbol";
 !             fprintf(stderr,
@@ -287,27 +287,27 @@ Index: perly.c
           }
   #endif
 ***************
-*** 1438,1442 ****
+*** 1443,1447 ****
   #if YYDEBUG
       if (yydebug)
 !         printf("yydebug: state %d, reducing by rule %d (%s)\n",
                   yystate, yyn, yyrule[yyn]);
   #endif
---- 1452,1456 ----
+--- 1457,1461 ----
   #if YYDEBUG
       if (yydebug)
 !         fprintf(stderr, "yydebug: state %d, reducing by rule %d (%s)\n",
                   yystate, yyn, yyrule[yyn]);
   #endif
 ***************
-*** 2185,2190 ****
+*** 2213,2218 ****
   #if YYDEBUG
           if (yydebug)
 !             printf("yydebug: after reduction, shifting from state 0 to\
 !  state %d\n", YYFINAL);
   #endif
           yystate = YYFINAL;
---- 2199,2205 ----
+--- 2227,2233 ----
   #if YYDEBUG
           if (yydebug)
 !             fprintf(stderr,
@@ -316,20 +316,20 @@ Index: perly.c
   #endif
           yystate = YYFINAL;
 ***************
-*** 2200,2204 ****
+*** 2228,2232 ****
                   if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
                   if (!yys) yys = "illegal-symbol";
 !                 printf("yydebug: state %d, reading %d (%s)\n",
                           YYFINAL, yychar, yys);
               }
---- 2215,2219 ----
+--- 2243,2247 ----
                   if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
                   if (!yys) yys = "illegal-symbol";
 !                 fprintf(stderr, "yydebug: state %d, reading %d (%s)\n",
                           YYFINAL, yychar, yys);
               }
 ***************
-*** 2215,2224 ****
+*** 2243,2252 ****
   #if YYDEBUG
       if (yydebug)
 !         printf("yydebug: after reduction, shifting from state %d \
@@ -340,7 +340,7 @@ Index: perly.c
 !         goto yyoverflow;
       }
       *++yyssp = yystate;
---- 2230,2254 ----
+--- 2258,2282 ----
   #if YYDEBUG
       if (yydebug)
 !         fprintf(stderr,
@@ -367,7 +367,7 @@ Index: perly.c
       }
       *++yyssp = yystate;
 ***************
-*** 2226,2233 ****
+*** 2254,2261 ****
       goto yyloop;
   yyoverflow:
 !     yyerror("yacc stack overflow");
@@ -376,7 +376,7 @@ Index: perly.c
   yyaccept:
 !     return (0);
   }
---- 2256,2263 ----
+--- 2284,2291 ----
       goto yyloop;
   yyoverflow:
 !     yyerror("Out of memory for yacc stack");
diff --git a/perly.y b/perly.y
index a281dff..75d9a3a 100644 (file)
--- a/perly.y
+++ b/perly.y
@@ -46,12 +46,13 @@ dep()
 %token <ival> DOLSHARP DO HASHBRACK NOAMP
 %token LOCAL MY
 
-%type <ival> prog decl local format startsub remember mremember '&'
+%type <ival> prog decl local format startsub startanonsub
+%type <ival> remember mremember '&'
 %type <opval> block mblock lineseq line loop cond else
 %type <opval> expr term scalar ary hsh arylen star amper sideff
 %type <opval> argexpr nexpr texpr iexpr mexpr mnexpr mtexpr miexpr
 %type <opval> listexpr listexprcom indirob
-%type <opval> listop method proto cont my_scalar
+%type <opval> listop method subname proto subbody cont my_scalar
 %type <pval> label
 
 %left <ival> OROP
@@ -269,19 +270,32 @@ format    :       FORMAT startsub WORD block
                        { newFORM($2, Nullop, $3); }
        ;
 
-subrout        :       SUB startsub WORD proto block
+subrout        :       SUB startsub subname proto subbody
                        { newSUB($2, $3, $4, $5); }
-       |       SUB startsub WORD proto ';'
-                       { newSUB($2, $3, $4, Nullop); expect = XSTATE; }
+       ;
+
+startsub:      /* NULL */      /* start a subroutine scope */
+                       { $$ = start_subparse(); }
+       ;
+
+startanonsub:  /* NULL */      /* start an anonymous subroutine scope */
+                       { $$ = start_subparse();
+                         CvANON_on(compcv); }
+       ;
+
+subname        :       WORD    { char *name = SvPVx(((SVOP*)$1)->op_sv, na);
+                         if (strEQ(name, "BEGIN") || strEQ(name, "END"))
+                             CvUNIQUE_on(compcv);
+                         $$ = $1; }
        ;
 
 proto  :       /* NULL */
                        { $$ = Nullop; }
        |       THING
        ;
-               
-startsub:      /* NULL */      /* start a subroutine scope */
-                       { $$ = start_subparse(); }
+
+subbody        :       block   { $$ = $1; }
+       |       ';'     { $$ = Nullop; expect = XSTATE; }
        ;
 
 package :      PACKAGE WORD ';'
@@ -290,8 +304,10 @@ package :  PACKAGE WORD ';'
                        { package(Nullop); }
        ;
 
-use    :       USE startsub WORD WORD listexpr ';'
-                       { utilize($1, $2, $3, $4, $5); }
+use    :       USE startsub
+                       { CvUNIQUE_on(compcv); /* It's a BEGIN {} */ }
+                   WORD WORD listexpr ';'
+                       { utilize($1, $2, $4, $5, $6); }
        ;
 
 expr   :       expr ANDOP expr
@@ -333,11 +349,12 @@ listop    :       LSTOP indirob argexpr
                        { $$ = convert($1, 0, $2); }
        |       FUNC '(' listexprcom ')'
                        { $$ = convert($1, 0, $3); }
-       |       LSTOPSUB startsub block listexpr        %prec LSTOP
+       |       LSTOPSUB startanonsub block
+                       { $3 = newANONSUB($2, 0, $3); }
+                   listexpr            %prec LSTOP
                        { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                           append_elem(OP_LIST,
-                             prepend_elem(OP_LIST, newANONSUB($2, 0, $3), $4),
-                             $1)); }
+                                append_elem(OP_LIST,
+                                  prepend_elem(OP_LIST, $3, $5), $1)); }
        ;
 
 method :       METHOD
@@ -411,7 +428,7 @@ term        :       term ASSIGNOP term
                        { $$ = newANONHASH($2); }
        |       HASHBRACK ';' '}'                               %prec '('
                        { $$ = newANONHASH(Nullop); }
-       |       ANONSUB startsub proto block                    %prec '('
+       |       ANONSUB startanonsub proto block                %prec '('
                        { $$ = newANONSUB($2, $3, $4); }
        |       scalar  %prec '('
                        { $$ = $1; }
@@ -528,7 +545,7 @@ term        :       term ASSIGNOP term
        |       FUNC0 '(' ')'
                        { $$ = newOP($1, 0); }
        |       FUNC0SUB
-                       { $$ = newUNOP(OP_ENTERSUB, 0,
+                       { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                scalar($1)); }
        |       FUNC1 '(' ')'
                        { $$ = newOP($1, OPf_SPECIAL); }
index 30fa9ee..da45856 100644 (file)
@@ -26,7 +26,7 @@ $/ = '';
        =head1 DESCRIPTION
 
        This page provides a brief table of contents for the rest of the Perl
-       documentation set.  It is meant to be bescanned quickly or grepped
+       documentation set.  It is meant to be scanned quickly or grepped
        through to locate the proper section you're looking for.
 
        =head1 BASIC DOCUMENTATION
index ae67494..2a2a99f 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlio - perl's IO abstraction interface.
+perlapio - perl's IO abstraction interface.
 
 =head1 SYNOPSIS
 
index 5a3a83e..a6d6480 100644 (file)
@@ -48,7 +48,7 @@ create one of these complex data structures, you can just pinch, pilfer, or
 purloin a drop-in example from here.
 
 Let's look at each of these possible constructs in detail.  There are separate
-documents on each of the following:
+sections on each of the following:
 
 =over 5
 
@@ -62,10 +62,6 @@ documents on each of the following:
 
 =item * more elaborate constructs
 
-=item * recursive and self-referential data structures
-
-=item * objects
-
 =back
 
 But for now, let's look at some of the general issues common to all
@@ -387,7 +383,7 @@ types of data structures.
 
  # print the whole thing one at a time
  for $i ( 0 .. $#LoL ) {
-     for $j ( 0 .. $#{$LoL[$i]} ) {
+     for $j ( 0 .. $#{ $LoL[$i] } ) {
          print "elt $i $j is $LoL[$i][$j]\n";
      }
  }
@@ -397,9 +393,9 @@ types of data structures.
 =head2 Declaration of a HASH OF LISTS
 
  %HoL = (
-        "flintstones"        => [ "fred", "barney" ],
-        "jetsons"            => [ "george", "jane", "elroy" ],
-        "simpsons"           => [ "homer", "marge", "bart" ],
+        flintstones        => [ "fred", "barney" ],
+        jetsons            => [ "george", "jane", "elroy" ],
+        simpsons           => [ "homer", "marge", "bart" ],
       );
 
 =head2 Generation of a HASH OF LISTS
@@ -456,12 +452,17 @@ types of data structures.
  }
 
  # print the whole thing sorted by number of members
- foreach $family ( sort { @{$HoL{$b}} <=> @{$HoL{$b}} } keys %HoL ) {
+ foreach $family ( sort { @{$HoL{$b}} <=> @{$HoL{$a}} } keys %HoL ) {
      print "$family: @{ $HoL{$family} }\n"
  }
 
  # print the whole thing sorted by number of members and name
- foreach $family ( sort { @{$HoL{$b}} <=> @{$HoL{$a}} } keys %HoL ) {
+ foreach $family ( sort { 
+                           @{$HoL{$b}} <=> @{$HoL{$a}}
+                                       ||
+                                   $a cmp $b
+           } keys %HoL )
+ {
      print "$family: ", join(", ", sort @{ $HoL{$family}), "\n";
  }
 
@@ -560,19 +561,19 @@ types of data structures.
 =head2 Declaration of a HASH OF HASHES
 
  %HoH = (
-        "flintstones" => {
-            "lead"    => "fred",
-            "pal"     => "barney",
+        flintstones => {
+               lead      => "fred",
+               pal       => "barney",
         },
-        "jetsons"     => {
-            "lead"    => "george",
-            "wife"    => "jane",
-            "his boy" => "elroy",
+        jetsons     => {
+               lead      => "george",
+               wife      => "jane",
+               "his boy" => "elroy",
         },
-        "simpsons"    => {
-             "lead"   => "homer",
-             "wife"   => "marge",
-             "kid"    => "bart",
+        simpsons    => {
+               lead      => "homer",
+               wife      => "marge",
+               kid       => "bart",
        },
  );
 
@@ -614,8 +615,8 @@ types of data structures.
 
  # append new members to an existing family
  %new_folks = (
-     "wife" => "wilma",
-     "pet"  => "dino";
+     wife => "wilma",
+     pet  => "dino";
  );
 
  for $what (keys %new_folks) {
@@ -650,7 +651,7 @@ types of data structures.
 
 
  # print the whole thing sorted by number of members
- foreach $family ( sort { keys %{$HoH{$b}} <=> keys %{$HoH{$b}} } keys %HoH ) {
+ foreach $family ( sort { keys %{$HoH{$b}} <=> keys %{$HoH{$a}} } keys %HoH ) {
      print "$family: { ";
      for $role ( sort keys %{ $HoH{$family} } ) {
          print "$role=$HoH{$family}{$role} ";
@@ -663,10 +664,10 @@ types of data structures.
  for ( qw(lead wife son daughter pal pet) ) { $rank{$_} = ++$i }
 
  # now print the whole thing sorted by number of members
- foreach $family ( sort { keys %{$HoH{$b}} <=> keys %{$HoH{$b}} } keys %HoH ) {
+ foreach $family ( sort { keys %{ $HoH{$b} } <=> keys %{ $HoH{$a} } } keys %HoH ) {
      print "$family: { ";
      # and print these according to rank order
-     for $role ( sort { $rank{$a} <=> $rank{$b} keys %{ $HoH{$family} } } ) {
+     for $role ( sort { $rank{$a} <=> $rank{$b} }  keys %{ $HoH{$family} } ) {
          print "$role=$HoH{$family}{$role} ";
      }
      print "}\n";
@@ -710,7 +711,7 @@ many different sorts:
 =head2 Declaration of a HASH OF COMPLEX RECORDS
 
      %TV = (
-        "flintstones" => {
+        flintstones => {
             series   => "flintstones",
             nights   => [ qw(monday thursday friday) ],
             members  => [
@@ -720,7 +721,7 @@ many different sorts:
             ],
         },
 
-        "jetsons"     => {
+        jetsons     => {
             series   => "jetsons",
             nights   => [ qw(wednesday saturday) ],
             members  => [
@@ -730,7 +731,7 @@ many different sorts:
             ],
          },
 
-        "simpsons"    => {
+        simpsons    => {
             series   => "simpsons",
             nights   => [ qw(monday) ],
             members  => [
@@ -776,7 +777,7 @@ many different sorts:
      foreach $family (keys %TV) {
          $rec = $TV{$family}; # temp pointer
          @kids = ();
-         for $person ( @{$rec->{members}} ) {
+         for $person ( @{ $rec->{members} } ) {
              if ($person->{role} =~ /kid|son|daughter/) {
                  push @kids, $person;
              }
@@ -805,7 +806,7 @@ many different sorts:
          for $who ( @{ $TV{$family}{members} } ) {
              print " $who->{name} ($who->{role}), age $who->{age}\n";
          }
-         print "it turns out that $TV{$family}{'lead'} has ";
+         print "it turns out that $TV{$family}{lead} has ";
          print scalar ( @{ $TV{$family}{kids} } ), " kids named ";
          print join (", ", map { $_->{name} } @{ $TV{$family}{kids} } );
          print "\n";
@@ -830,4 +831,4 @@ perlref(1), perllol(1), perldata(1), perlobj(1)
 Tom Christiansen E<lt>F<tchrist@perl.com>E<gt>
 
 Last update:
-Mon Jul  8 05:22:49 MDT 1996
+Wed Oct 23 04:57:50 MET DST 1996
index 62a1965..c1cd67d 100644 (file)
@@ -281,8 +281,8 @@ file, or a file at EOF when testing a filehandle.  Because you have to
 read a file to do the C<-T> test, on most occasions you want to use a C<-f>
 against the file first, as in C<next unless -f $file && -T $file>.
 
-If any of the file tests (or either the stat() or lstat() operators) are given the
-special filehandle consisting of a solitary underline, then the stat
+If any of the file tests (or either the stat() or lstat() operators) are given
+the special filehandle consisting of a solitary underline, then the stat
 structure of the previous file test (or stat operator) is used, saving
 a system call.  (This doesn't work with C<-t>, and you need to remember
 that lstat() and C<-l> will leave values in the stat structure for the
@@ -338,7 +338,7 @@ fail with $! set to EINTR because Perl sets up signal handlers to
 restart system calls on some systems.  Using eval/die always works.
 
     eval {
-       local $SIG{ALRM} = sub { die "alarm\n" };       # NB \n required
+       local $SIG{ALRM} = sub { die "alarm\n" };       # NB \n required
        alarm $timeout;
        $nread = sysread SOCKET, $buffer, $size;
        alarm 0;
@@ -355,6 +355,11 @@ restart system calls on some systems.  Using eval/die always works.
 
 Returns the arctangent of Y/X in the range -PI to PI.
 
+For the tangent operation, you may use the POSIX::tan()
+function, or use the familiar relation:
+
+    sub tan { sin($_[0]) / cos($_[0])  }
+
 =item bind SOCKET,NAME
 
 Binds a network address to a socket, just as the bind system call
@@ -380,7 +385,7 @@ is taken as the name of the filehandle.
 
 =item bless REF
 
-This function tells the referenced object (passed as REF) that it is now
+This function tells the thingy referenced by REF that it is now
 an object in the CLASSNAME package--or the current package if no CLASSNAME
 is specified, which is often the case.  It returns the reference for
 convenience, because a bless() is often the last thing in a constructor.
@@ -393,8 +398,9 @@ blessing (and blessings) of objects.
 =item caller
 
 Returns the context of the current subroutine call.  In a scalar context,
-returns TRUE if there is a caller, that is, if we're in a subroutine or
-eval() or require(), and FALSE otherwise.  In a list context, returns
+returns the caller's package name if there is a caller, that is, if
+we're in a subroutine or eval() or require(), and the undefined value
+otherwise.  In a list context, returns
 
     ($package, $filename, $line) = caller;
 
@@ -403,7 +409,7 @@ print a stack trace.  The value of EXPR indicates how many call frames
 to go back before the current one.
 
     ($package, $filename, $line,
-     $subroutine, $hasargs, $wantargs) = caller($i);
+     $subroutine, $hasargs, $wantarray) = caller($i);
 
 Furthermore, when called from within the DB package, caller returns more
 detailed information: it sets the list variable @DB::args to be the
@@ -432,12 +438,12 @@ number.  Returns the number of files successfully changed.
 
 This is a slightly safer version of chop (see below).  It removes any
 line ending that corresponds to the current value of C<$/> (also known as
-$INPUT_RECORD_SEPARATOR in the C<English> module).  It returns the number
-of characters removed.  It's often used to remove the newline from the
-end of an input record when you're worried that the final record may be
-missing its newline.  When in paragraph mode (C<$/ = "">), it removes all
-trailing newlines from the string.  If VARIABLE is omitted, it chomps
-$_.  Example:
+$INPUT_RECORD_SEPARATOR in the C<English> module).  It returns the total
+number of characters removed from all its arguments.  It's often used to
+remove the newline from the end of an input record when you're worried
+that the final record may be missing its newline.  When in paragraph mode
+(C<$/ = "">), it removes all trailing newlines from the string.  If
+VARIABLE is omitted, it chomps $_.  Example:
 
     while (<>) {
        chomp;  # avoid \n on last field
@@ -525,7 +531,7 @@ If NUMBER is omitted, uses $_.
 This function works as the system call by the same name: it makes the
 named directory the new root directory for all further pathnames that
 begin with a "/" by your process and all of its children.  (It doesn't
-change your current working directory is unaffected.)  For security
+change your current working directory, which is unaffected.)  For security
 reasons, this call is restricted to the superuser.  If FILENAME is
 omitted, does chroot to $_.
 
@@ -575,6 +581,11 @@ statement).
 Returns the cosine of EXPR (expressed in radians).  If EXPR is omitted
 takes cosine of $_.
 
+For the inverse cosine operation, you may use the POSIX::acos()
+function, or use this relation:
+
+    sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ) }
+
 =item crypt PLAINTEXT,SALT
 
 Encrypts a string exactly like the crypt(3) function in the C library
@@ -689,6 +700,24 @@ you should use defined() only when you're questioning the integrity
 of what you're trying to do.  At other times, a simple comparison to
 0 or "" is what you want.
 
+Another surprise is that using defined() on an entire array or 
+hash reports whether memory for that aggregate has ever been
+allocated.  So an array you set to the empty list appears undefined
+initially, and one that once was full and that you then set to 
+the empty list still appears defined.  You should instead use a 
+simple test for size:
+
+    if (@an_array) { print "has array elements\n" }
+    if (%a_hash)   { print "has hash members\n"   }
+
+Using undef() on these, however, does clear their memory and then report
+them as not defined anymore, but you shoudln't do that unless you don't
+plan to use them again, because it saves time when you load them up
+again to have memory already ready to be filled.
+
+This counter-intuitive behaviour of defined() on aggregates may be
+changed, fixed, or broken in a future release of Perl.
+
 =item delete EXPR
 
 Deletes the specified key(s) and their associated values from a hash
@@ -719,10 +748,10 @@ hash element lookup or hash slice:
 
 Outside of an eval(), prints the value of LIST to C<STDERR> and exits with
 the current value of C<$!> (errno).  If C<$!> is 0, exits with the value of
-C<($? E<gt>E<gt> 8)> (back-tick `command` status).  If C<($? E<gt>E<gt> 8)> is 0,
-exits with 255.  Inside an eval(), the error message is stuffed into C<$@>,
-and the eval() is terminated with the undefined value; this makes die()
-the way to raise an exception.
+C<($? E<gt>E<gt> 8)> (back-tick `command` status).  If C<($? E<gt>E<gt> 8)>
+is 0, exits with 255.  Inside an eval(), the error message is stuffed into
+C<$@>, and the eval() is terminated with the undefined value; this makes
+die() the way to raise an exception.
 
 Equivalent examples:
 
@@ -998,6 +1027,10 @@ are called before exit.)  Example:
 
 See also die().  If EXPR is omitted, exits with 0 status.
 
+You shouldn't use exit() to abort a subroutine if there's any chance that
+someone might want to trap whatever error happened.  Use die() instead,
+which can be trapped by an eval().
+
 =item exp EXPR
 
 =item exp 
@@ -1086,8 +1119,8 @@ See also L<DB_File> for other flock() examples.
 Does a fork(2) system call.  Returns the child pid to the parent process
 and 0 to the child process, or C<undef> if the fork is unsuccessful.
 Note: unflushed buffers remain unflushed in both processes, which means
-you may need to set C<$|> ($AUTOFLUSH in English) or call the 
-autoflush() FileHandle method to avoid duplicate output.
+you may need to set C<$|> ($AUTOFLUSH in English) or call the autoflush()
+method of IO::Handle to avoid duplicate output.
 
 If you fork() without ever waiting on your children, you will accumulate
 zombies:
@@ -1112,6 +1145,11 @@ fork() returns omitted);
 See also L<perlipc> for more examples of forking and reaping
 moribund children.
 
+Note that if your forked child inherits system file descriptors like
+STDIN and STDOUT that are actually connected by a pipe or socket, even
+if you exit, the remote server (such as, say, httpd or rsh) won't think
+you're done.  You should reopen those to /dev/null if it's any issue.
+
 =item format
 
 Declare a picture format with use by the write() function.  For
@@ -1178,8 +1216,10 @@ single-characters, however.  For that, try something more like:
 Determination of whether to whether $BSD_STYLE should be set 
 is left as an exercise to the reader.  
 
+The POSIX::getattr() function can do this more portably on systems
+alleging POSIX compliance.
 See also the C<Term::ReadKey> module from your nearest CPAN site;
-details on CPAN can be found on L<perlmod/CPAN> 
+details on CPAN can be found on L<perlmod/CPAN> 
 
 =item getlogin
 
@@ -1922,7 +1962,7 @@ If you want a "real" C open() (see L<open(2)> on your system), then
 you should use the sysopen() function.  This is another way to
 protect your filenames from interpretation.  For example:
 
-    use FileHandle;
+    use IO::Handle;
     sysopen(HANDLE, $path, O_RDWR|O_CREAT|O_EXCL, 0700)
        or die "sysopen $path: $!";
     HANDLE->autoflush(1);
@@ -2074,6 +2114,8 @@ for examples of such things.
 
 =item pop ARRAY
 
+=item pop 
+
 Pops and returns the last value of the array, shortening the array by
 1.  Has a similar effect to
 
@@ -2130,6 +2172,10 @@ of the list will be interpreted as the printf format.  If C<use locale> is
 in effect, the character used for the decimal point in formatted real numbers
 is affected by the LC_NUMERIC locale.  See L<perllocale>.
 
+Don't fall into the trap of using a printf() when a simple
+print() would do.  The print() is more efficient, and less
+error prone.
+
 =item prototype FUNCTION
 
 Returns the prototype of a function as a string (or C<undef> if the
@@ -2485,7 +2531,7 @@ actual filehandle.  Thus:
 Some programmers may prefer to think of filehandles as objects with
 methods, preferring to write the last example as:
 
-    use FileHandle;
+    use IO::Handle;
     STDERR->autoflush(1);
 
 =item select RBITS,WBITS,EBITS,TIMEOUT
@@ -2641,6 +2687,11 @@ has the same interpretation as in the system call of the same name.
 Returns the sine of EXPR (expressed in radians).  If EXPR is omitted,
 returns sine of $_.
 
+For the inverse sine operation, you may use the POSIX::sin()
+function, or use this relation:
+
+    sub asin { atan2($_[0], sqrt(1 - $_[0] * $_[0])) }
+
 =item sleep EXPR
 
 =item sleep
@@ -2932,12 +2983,39 @@ root of $_.
 
 Sets the random number seed for the C<rand> operator.  If EXPR is omitted,
 uses a semi-random value based on the current time and process ID, among
-other things.  Of course, you'd need something much more random than that for
-cryptographic purposes, because it's easy to guess the current time.
-Checksumming the compressed output of rapidly changing operating system
-status programs is the usual method.  Examples are posted regularly to
-the comp.security.unix newsgroup.
+other things.
+
+Simply seeding with time() and the process ID isn't particularly random,
+especially if they vary together.
+
+Try something like this instead:
+
+    srand( time() ^ ($$ + ($$ << 15)) );
 
+Of course, you'd need something much more random than that for
+serious cryptographic purposes, since it's easy to guess the current time.
+Checksumming the compressed output of one or more rapidly changing operating
+system status programs is the usual method. For example:
+
+    srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
+
+Do I<not>fP call srand() multiple times in your program unless you know
+exactly what you're doing and why you're doing it.  The point of the
+function is to "seed" the rand() function so that rand() can produce
+a different sequence each time you run your program.  Just do it once at the
+top of your program, or you I<won't> get random numbers out of rand()!
+
+Frequently called programs (like CGI scripts) that simply use 
+
+    time ^ $$
+
+for a seed can fall prey to the mathematical property that 
+
+    a^b == (a+1)^(b+1)
+
+one-third of the time.  If you're particularly concerned with this,
+see the Math::TrulyRandom module in CPAN.
+  
 =item stat FILEHANDLE
 
 =item stat EXPR
@@ -3120,6 +3198,9 @@ the value of PERMS specifies the permissions of the newly created
 file.  If PERMS is omitted, the default value is 0666, which allows
 read and write for all.  This default is reasonable: see C<umask>.
 
+The IO::File module provides a more object-oriented approach, if you're
+into that kind of thing.
+
 =item sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
 
 =item sysread FILEHANDLE,SCALAR,LENGTH
@@ -3146,9 +3227,42 @@ Note that argument processing varies depending on the number of
 arguments.  The return value is the exit status of the program as
 returned by the wait() call.  To get the actual exit value divide by
 256.  See also L</exec>.  This is I<NOT> what you want to use to capture 
-the output from a command, for that you should use merely back-ticks, as
-described in L<perlop/"`STRING`">.
+the output from a command, for that you should use merely back-ticks or
+qx//, as described in L<perlop/"`STRING`">.
 
+Because system() and back-ticks block SIGINT and SIGQUIT, killing the
+program they're running doesn't actually interrupt your program.
+
+    @args = ("command", "arg1", "arg2");
+    system(@args) == 0 
+        or die "system @args failed: $?" 
+
+Here's a more elaborate example of analysing the return value from
+system() on a UNIX system to check for all possibilities, including for
+signals and coredumps.
+
+    $rc = 0xffff & system @args;
+    printf "system(%s) returned %#04x: ", "@args", $rc;
+    if ($rc == 0) {
+       print "ran with normal exit\n";
+    } 
+    elsif ($rc == 0xff00) {
+       print "command failed: $!\n";
+    } 
+    elsif ($rc > 0x80) {
+       $rc >>= 8;
+       print "ran with non-zero exit status $rc\n";
+    } 
+    else {
+       print "ran with ";
+       if ($rc &   0x80) {
+           $rc &= ~0x80;
+           print "coredump from ";
+       } 
+       print "signal $rc\n"
+    } 
+    $ok = ($rc != 0);
+  
 =item syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
 
 =item syswrite FILEHANDLE,SCALAR,LENGTH
index 6c12d29..e6d1225 100644 (file)
@@ -40,7 +40,7 @@ are still supported for backwards compatibility
 C<use IO::Handle> (or C<IO::Seekable> or C<IO::File>) and
 C<*STDOUT{IO}> are the way of the future.
 
-=head2 Internal Change: PerlIO internal IO abstraction interface.
+=head2 Internal Change: PerlIO internal IO abstraction interface
 
 It is now possible to build Perl with AT&T's sfio IO package
 instead of stdio.  See L<perlapio> for more details, and
index 96cf9f9..cbc1785 100644 (file)
@@ -6,7 +6,7 @@ perltoc - perl documentation table of contents
 =head1 DESCRIPTION
 
 This page provides a brief table of contents for the rest of the Perl
-documentation set.  It is meant to be bescanned quickly or grepped
+documentation set.  It is meant to be scanned quickly or grepped
 through to locate the proper section you're looking for.
 
 =head1 BASIC DOCUMENTATION
@@ -56,7 +56,7 @@ HOME, LOGDIR, PATH, PERL5LIB, PERL5DB, PERL_DESTRUCT_LEVEL, PERLLIB
 
 =item Internal Change: FileHandle Deprecated
 
-=item Internal Change: PerlIO internal IO abstraction interface.
+=item Internal Change: PerlIO internal IO abstraction interface
 
 =item New and Changed Built-in Variables
 
@@ -340,16 +340,16 @@ map EXPR,LIST, mkdir FILENAME,MODE, msgctl ID,CMD,ARG, msgget KEY,FLAGS,
 msgsnd ID,MSG,FLAGS, msgrcv ID,VAR,SIZE,TYPE,FLAGS, my EXPR, next LABEL,
 next, no Module LIST, oct EXPR, oct, open FILEHANDLE,EXPR, open FILEHANDLE,
 opendir DIRHANDLE,EXPR, ord EXPR, ord, pack TEMPLATE,LIST, package
-NAMESPACE, pipe READHANDLE,WRITEHANDLE, pop ARRAY, pos SCALAR, pos, print
-FILEHANDLE LIST, print LIST, print, printf FILEHANDLE FORMAT, LIST, printf
-FORMAT, LIST, prototype FUNCTION, push ARRAY,LIST, q/STRING/, qq/STRING/,
-qx/STRING/, qw/STRING/, quotemeta EXPR, quotemeta, rand EXPR, rand, read
-FILEHANDLE,SCALAR,LENGTH,OFFSET, read FILEHANDLE,SCALAR,LENGTH, readdir
-DIRHANDLE, readlink EXPR, readlink, recv SOCKET,SCALAR,LEN,FLAGS, redo
-LABEL, redo, ref EXPR, ref, rename OLDNAME,NEWNAME, require EXPR, require,
-reset EXPR, reset, return LIST, reverse LIST, rewinddir DIRHANDLE, rindex
-STR,SUBSTR,POSITION, rindex STR,SUBSTR, rmdir FILENAME, rmdir, s///, scalar
-EXPR, seek FILEHANDLE,POSITION,WHENCE, seekdir DIRHANDLE,POS, select
+NAMESPACE, pipe READHANDLE,WRITEHANDLE, pop ARRAY, pop, pos SCALAR, pos,
+print FILEHANDLE LIST, print LIST, print, printf FILEHANDLE FORMAT, LIST,
+printf FORMAT, LIST, prototype FUNCTION, push ARRAY,LIST, q/STRING/,
+qq/STRING/, qx/STRING/, qw/STRING/, quotemeta EXPR, quotemeta, rand EXPR,
+rand, read FILEHANDLE,SCALAR,LENGTH,OFFSET, read FILEHANDLE,SCALAR,LENGTH,
+readdir DIRHANDLE, readlink EXPR, readlink, recv SOCKET,SCALAR,LEN,FLAGS,
+redo LABEL, redo, ref EXPR, ref, rename OLDNAME,NEWNAME, require EXPR,
+require, reset EXPR, reset, return LIST, reverse LIST, rewinddir DIRHANDLE,
+rindex STR,SUBSTR,POSITION, rindex STR,SUBSTR, rmdir FILENAME, rmdir, s///,
+scalar EXPR, seek FILEHANDLE,POSITION,WHENCE, seekdir DIRHANDLE,POS, select
 FILEHANDLE, select, select RBITS,WBITS,EBITS,TIMEOUT, semctl
 ID,SEMNUM,CMD,ARG, semget KEY,NSEMS,FLAGS, semop KEY,OPSTRING, send
 SOCKET,MSG,FLAGS,TO, send SOCKET,MSG,FLAGS, setpgrp PID,PGRP, setpriority
@@ -361,20 +361,19 @@ SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL, sort SUBNAME LIST, sort BLOCK LIST,
 sort LIST, splice ARRAY,OFFSET,LENGTH,LIST, splice ARRAY,OFFSET,LENGTH,
 splice ARRAY,OFFSET, split /PATTERN/,EXPR,LIMIT, split /PATTERN/,EXPR,
 split /PATTERN/, split, sprintf FORMAT, LIST, sqrt EXPR, sqrt, srand EXPR,
-stat FILEHANDLE, stat EXPR, stat, study SCALAR, study, sub BLOCK, sub NAME,
-sub NAME BLOCK, substr EXPR,OFFSET,LEN, substr EXPR,OFFSET, symlink
-OLDFILE,NEWFILE, syscall LIST, sysopen FILEHANDLE,FILENAME,MODE, sysopen
+stat EXPR, stat, study SCALAR, study, sub BLOCK, sub NAME, sub NAME BLOCK,
+substr EXPR,OFFSET,LEN, substr EXPR,OFFSET, symlink OLDFILE,NEWFILE,
+syscall LIST, sysopen FILEHANDLE,FILENAME,MODE, sysopen
 FILEHANDLE,FILENAME,MODE,PERMS, sysread FILEHANDLE,SCALAR,LENGTH,OFFSET,
 sysread FILEHANDLE,SCALAR,LENGTH, system LIST, syswrite
-FILEHANDLE,SCALAR,LENGTH,OFFSET, syswrite FILEHANDLE,SCALAR,LENGTH, tell
-FILEHANDLE, tell, telldir DIRHANDLE, tie VARIABLE,CLASSNAME,LIST, tied
-VARIABLE, time, times, tr///, truncate FILEHANDLE,LENGTH, truncate
-EXPR,LENGTH, uc EXPR, uc, ucfirst EXPR, ucfirst, umask EXPR, umask, undef
-EXPR, undef, unlink LIST, unlink, unpack TEMPLATE,EXPR, untie VARIABLE,
-unshift ARRAY,LIST, use Module LIST, use Module, use Module VERSION LIST,
-use VERSION, utime LIST, values ASSOC_ARRAY, vec EXPR,OFFSET,BITS, wait,
-waitpid PID,FLAGS, wantarray, warn LIST, write FILEHANDLE, write EXPR,
-write, y///
+FILEHANDLE,SCALAR,LENGTH, tell FILEHANDLE, tell, telldir DIRHANDLE, tie
+VARIABLE,CLASSNAME,LIST, tied VARIABLE, time, times, tr///, truncate
+FILEHANDLE,LENGTH, truncate EXPR,LENGTH, uc EXPR, uc, ucfirst EXPR,
+ucfirst, umask EXPR, umask, undef EXPR, undef, unlink LIST, unlink, unpack
+TEMPLATE,EXPR, untie VARIABLE, unshift ARRAY,LIST, use Module LIST, use
+Module, use Module VERSION LIST, use VERSION, utime LIST, values
+ASSOC_ARRAY, vec EXPR,OFFSET,BITS, wait, waitpid PID,FLAGS, wantarray, warn
+LIST, write FILEHANDLE, write EXPR, write, y///
 
 =back
 
@@ -670,8 +669,7 @@ LC_TIME, LANG
 =item DESCRIPTION
 
 arrays of arrays, hashes of arrays, arrays of hashes, hashes of hashes,
-more elaborate constructs, recursive and self-referential data structures,
-objects
+more elaborate constructs
 
 =item REFERENCES
 
@@ -1192,7 +1190,7 @@ program
 
 =item AUTHOR
 
-=head2 perlapio, perlio - perl's IO abstraction interface.
+=head2 perlapio - perl's IO abstraction interface.
 
 =item SYNOPSIS
 
index b9e3b87..40432e0 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1685,7 +1685,6 @@ PP(pp_entersub)
     register CONTEXT *cx;
     I32 gimme;
     bool hasargs = (op->op_flags & OPf_STACKED) != 0;
-    bool may_clone = TRUE;
 
     if (!sv)
        DIE("Not a CODE reference");
@@ -1705,17 +1704,14 @@ PP(pp_entersub)
            break;
        }
        cv = (CV*)SvRV(sv);
-       if (SvTYPE(cv) == SVt_PVCV) {
-           may_clone = FALSE;
+       if (SvTYPE(cv) == SVt_PVCV)
            break;
-       }
        /* FALL THROUGH */
     case SVt_PVHV:
     case SVt_PVAV:
        DIE("Not a CODE reference");
     case SVt_PVCV:
        cv = (CV*)sv;
-       may_clone = FALSE;
        break;
     case SVt_PVGV:
        if (!(cv = GvCVu((GV*)sv)))
@@ -1723,9 +1719,6 @@ PP(pp_entersub)
        break;
     }
 
-    if (may_clone && cv && CvCLONE(cv))
-       cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
-
     ENTER;
     SAVETMPS;
 
@@ -1757,7 +1750,7 @@ PP(pp_entersub)
     }
 
     gimme = GIMME;
-    if ((op->op_private & OPpENTERSUB_DB) && !CvNODEBUG(cv)) {
+    if ((op->op_private & OPpENTERSUB_DB) && GvCV(DBsub) && !CvNODEBUG(cv)) {
        SV *oldsv = sv;
        sv = GvSV(DBsub);
        save_item(sv);
index e69de29..0d3de96 100755 (executable)
@@ -0,0 +1,371 @@
+#!./perl
+#
+# Contributed by Graham Barr <Graham.Barr@tiuk.ti.com>
+#
+# So far there are tests for the following prototypes.
+# none, () ($) ($@) ($%) ($;$) (&) (&\@) (&@) (%) (\%) (\@)
+#
+# It is impossible to test every prototype that can be specified, but
+# we should test as many as we can.
+
+use strict;
+
+print "1..74\n";
+
+my $i = 1;
+
+sub testing (&$) {
+    my $p = prototype(shift);
+    my $c = shift;
+    my $what = defined $c ? '(' . $p . ')' : 'no prototype';   
+    print '#' x 25,"\n";
+    print '# Testing ',$what,"\n";
+    print '#' x 25,"\n";
+    print "not "
+       if((defined($p) && defined($c) && $p ne $c)
+          || (defined($p) != defined($c)));
+    printf "ok %d\n",$i++;
+}
+
+@_ = qw(a b c d);
+my @array;
+my %hash;
+
+##
+##
+##
+
+testing \&no_proto, undef;
+
+sub no_proto {
+    print "# \@_ = (",join(",",@_),")\n";
+    scalar(@_)
+}
+
+print "not " unless 0 == no_proto();
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == no_proto(5);
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &no_proto;
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == no_proto +6;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == no_proto(@_);
+printf "ok %d\n",$i++;
+
+##
+##
+##
+
+
+testing \&no_args, '';
+
+sub no_args () {
+    print "# \@_ = (",join(",",@_),")\n";
+    scalar(@_)
+}
+
+print "not " unless 0 == no_args();
+printf "ok %d\n",$i++;
+
+print "not " unless 0 == no_args;
+printf "ok %d\n",$i++;
+
+print "not " unless 5 == no_args +5;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &no_args;
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == &no_args(1,2);
+printf "ok %d\n",$i++;
+
+eval "no_args(1)";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+##
+##
+##
+
+testing \&one_args, '$';
+
+sub one_args ($) {
+    print "# \@_ = (",join(",",@_),")\n";
+    scalar(@_)
+}
+
+print "not " unless 1 == one_args(1);
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == one_args +5;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &one_args;
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == &one_args(1,2);
+printf "ok %d\n",$i++;
+
+eval "one_args(1,2)";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+eval "one_args()";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+sub one_a_args ($) {
+    print "# \@_ = (",join(",",@_),")\n";
+    print "not " unless @_ == 1 && $_[0] == 4;
+    printf "ok %d\n",$i++;
+}
+
+one_a_args(@_);
+
+##
+##
+##
+
+testing \&over_one_args, '$@';
+
+sub over_one_args ($@) {
+    print "# \@_ = (",join(",",@_),")\n";
+    scalar(@_)
+}
+
+print "not " unless 1 == over_one_args(1);
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == over_one_args(1,2);
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == over_one_args +5;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &over_one_args;
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == &over_one_args(1,2);
+printf "ok %d\n",$i++;
+
+print "not " unless 5 == &over_one_args(1,@_);
+printf "ok %d\n",$i++;
+
+eval "over_one_args()";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+sub over_one_a_args ($@) {
+    print "# \@_ = (",join(",",@_),")\n";
+    print "not " unless @_ >= 1 && $_[0] == 4;
+    printf "ok %d\n",$i++;
+}
+
+over_one_a_args(@_);
+over_one_a_args(@_,1);
+over_one_a_args(@_,1,2);
+over_one_a_args(@_,@_);
+
+##
+##
+##
+
+testing \&scalar_and_hash, '$%';
+
+sub scalar_and_hash ($%) {
+    print "# \@_ = (",join(",",@_),")\n";
+    scalar(@_)
+}
+
+print "not " unless 1 == scalar_and_hash(1);
+printf "ok %d\n",$i++;
+
+print "not " unless 3 == scalar_and_hash(1,2,3);
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == scalar_and_hash +5;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &scalar_and_hash;
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == &scalar_and_hash(1,2);
+printf "ok %d\n",$i++;
+
+print "not " unless 5 == &scalar_and_hash(1,@_);
+printf "ok %d\n",$i++;
+
+eval "scalar_and_hash()";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+sub scalar_and_hash_a ($@) {
+    print "# \@_ = (",join(",",@_),")\n";
+    print "not " unless @_ >= 1 && $_[0] == 4;
+    printf "ok %d\n",$i++;
+}
+
+scalar_and_hash_a(@_);
+scalar_and_hash_a(@_,1);
+scalar_and_hash_a(@_,1,2);
+scalar_and_hash_a(@_,@_);
+
+##
+##
+##
+
+testing \&one_or_two, '$;$';
+
+sub one_or_two ($;$) {
+    print "# \@_ = (",join(",",@_),")\n";
+    scalar(@_)
+}
+
+print "not " unless 1 == one_or_two(1);
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == one_or_two(1,3);
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == one_or_two +5;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &one_or_two;
+printf "ok %d\n",$i++;
+
+print "not " unless 3 == &one_or_two(1,2,3);
+printf "ok %d\n",$i++;
+
+print "not " unless 5 == &one_or_two(1,@_);
+printf "ok %d\n",$i++;
+
+eval "one_or_two()";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+eval "one_or_two(1,2,3)";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+sub one_or_two_a ($;$) {
+    print "# \@_ = (",join(",",@_),")\n";
+    print "not " unless @_ >= 1 && $_[0] == 4;
+    printf "ok %d\n",$i++;
+}
+
+one_or_two_a(@_);
+one_or_two_a(@_,1);
+one_or_two_a(@_,@_);
+
+##
+##
+##
+
+testing \&a_sub, '&';
+
+sub a_sub (&) {
+    print "# \@_ = (",join(",",@_),")\n";
+    &{$_[0]};
+}
+
+sub tmp_sub_1 { printf "ok %d\n",$i++ }
+
+a_sub { printf "ok %d\n",$i++ };
+a_sub \&tmp_sub_1;
+
+@array = ( \&tmp_sub_1 );
+eval 'a_sub @array';
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+##
+##
+##
+
+testing \&sub_aref, '&\@';
+
+sub sub_aref (&\@) {
+    print "# \@_ = (",join(",",@_),")\n";
+    my($sub,$array) = @_;
+    print "not " unless @_ == 2 && @{$array} == 4;
+    print map { &{$sub}($_) } @{$array}
+}
+
+@array = (qw(O K)," ", $i++);
+sub_aref { lc shift } @array;
+print "\n";
+
+##
+##
+##
+
+testing \&sub_array, '&@';
+
+sub sub_array (&@) {
+    print "# \@_ = (",join(",",@_),")\n";
+    print "not " unless @_ == 5;
+    my $sub = shift;
+    print map { &{$sub}($_) } @_
+}
+
+@array = (qw(O K)," ", $i++);
+sub_array { lc shift } @array;
+print "\n";
+
+##
+##
+##
+
+testing \&a_hash, '%';
+
+sub a_hash (%) {
+    print "# \@_ = (",join(",",@_),")\n";
+    scalar(@_);
+}
+
+print "not " unless 1 == a_hash 'a';
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == a_hash 'a','b';
+printf "ok %d\n",$i++;
+
+##
+##
+##
+
+testing \&a_hash_ref, '\%';
+
+sub a_hash_ref (\%) {
+    print "# \@_ = (",join(",",@_),")\n";
+    print "not " unless ref($_[0]) && $_[0]->{'a'};
+    printf "ok %d\n",$i++;
+    $_[0]->{'b'} = 2;
+}
+
+%hash = ( a => 1);
+a_hash_ref %hash;
+print "not " unless $hash{'b'} == 2;
+printf "ok %d\n",$i++;
+
+##
+##
+##
+
+testing \&an_array_ref, '\@';
+
+sub an_array_ref (\@) {
+    print "# \@_ = (",join(",",@_),")\n";
+    print "not " unless ref($_[0]) && 1 == @{$_[0]};
+    printf "ok %d\n",$i++;
+    @{$_[0]} = (qw(ok)," ",$i++,"\n");
+}
+
+@array = ('a');
+an_array_ref @array;
+print "not " unless @array == 4;
+print @array;