From 3354d27a1739b364398038a2675cbc2612afdf20 Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Thu, 6 Aug 2015 13:20:01 -0600 Subject: [PATCH] Do not follow symbolic links in sudoedit by default. This behavior can be controlled by the sudoedit_follow Defaults flag as well as the FOLLOW/NOFOLLOW tags. --- doc/UPGRADE | 7 + doc/sudo.cat | 9 +- doc/sudo.man.in | 11 +- doc/sudo.mdoc.in | 11 +- doc/sudo_plugin.cat | 13 +- doc/sudo_plugin.man.in | 23 +- doc/sudo_plugin.mdoc.in | 21 +- doc/sudoers.cat | 40 +- doc/sudoers.man.in | 57 +- doc/sudoers.mdoc.in | 55 +- include/sudo_compat.h | 3 + include/sudo_plugin.h | 4 +- plugins/sudoers/def_data.c | 4 + plugins/sudoers/def_data.h | 2 + plugins/sudoers/def_data.in | 3 + plugins/sudoers/gram.c | 816 ++--- plugins/sudoers/gram.h | 34 +- plugins/sudoers/gram.y | 13 +- plugins/sudoers/ldap.c | 3 + plugins/sudoers/parse.c | 34 +- plugins/sudoers/parse.h | 49 + plugins/sudoers/policy.c | 4 + plugins/sudoers/regress/sudoers/test1.in | 2 + plugins/sudoers/regress/sudoers/test1.json.ok | 36 + plugins/sudoers/regress/sudoers/test1.out.ok | 1 + plugins/sudoers/regress/sudoers/test1.toke.ok | 1 + plugins/sudoers/sudoers_version.h | 3 +- plugins/sudoers/testsudoers.c | 9 +- plugins/sudoers/toke.c | 3250 +++++++++-------- plugins/sudoers/toke.l | 10 + plugins/sudoers/visudo_json.c | 86 +- src/sesh.c | 13 +- src/sudo.c | 5 + src/sudo.h | 33 +- src/sudo_edit.c | 76 +- 35 files changed, 2553 insertions(+), 2188 deletions(-) diff --git a/doc/UPGRADE b/doc/UPGRADE index b4ba2157b..b4bb897a6 100644 --- a/doc/UPGRADE +++ b/doc/UPGRADE @@ -1,6 +1,13 @@ Notes on upgrading from an older release ======================================== +o Upgrading from a version prior to 1.8.15: + + When editing files with sudoedit, symbolic links will no longer + be followed by default. The old behavior can be restored by + enabling the sudoedit_follow option in sudoers or on a per-command + basis with the FOLLOW and NOFOLLOW tags. + o Upgrading from a version prior to 1.8.14: On HP-UX, sudo will no longer check for "plugin.sl" if "plugin.so" diff --git a/doc/sudo.cat b/doc/sudo.cat index c4b5b3c67..36deb9930 100644 --- a/doc/sudo.cat +++ b/doc/sudo.cat @@ -124,6 +124,13 @@ DDEESSCCRRIIPPTTIIOONN copied back to their original location and the temporary versions are removed. + Unless explicitly allowed by the security policy, symbolic + links will not be opened. This helps prevent the editing of + unauthorized files when the file is located in a user- + writable directory. Versions of ssuuddoo prior to 1.8.15 do not + have this restriction. Users are never allowed to edit + device special files. + If the specified file does not exist, it will be created. Note that unlike most commands run by _s_u_d_o, the editor is run with the invoking user's environment unmodified. If, for @@ -585,4 +592,4 @@ DDIISSCCLLAAIIMMEERR file distributed with ssuuddoo or http://www.sudo.ws/license.html for complete details. -Sudo 1.8.14 July 10, 2015 Sudo 1.8.14 +Sudo 1.8.15 August 6, 2015 Sudo 1.8.15 diff --git a/doc/sudo.man.in b/doc/sudo.man.in index c3b50ac9d..455e5148a 100644 --- a/doc/sudo.man.in +++ b/doc/sudo.man.in @@ -21,7 +21,7 @@ .\" Agency (DARPA) and Air Force Research Laboratory, Air Force .\" Materiel Command, USAF, under agreement number F39502-99-1-0512. .\" -.TH "SUDO" "8" "July 10, 2015" "Sudo @PACKAGE_VERSION@" "System Manager's Manual" +.TH "SUDO" "8" "August 6, 2015" "Sudo @PACKAGE_VERSION@" "System Manager's Manual" .nh .if n .ad l .SH "NAME" @@ -292,6 +292,15 @@ their original location and the temporary versions are removed. .RE .RS 12n .sp +Unless explicitly allowed by the security policy, symbolic links +will not be opened. +This helps prevent the editing of unauthorized files when the file +is located in a user-writable directory. +Versions of +\fBsudo\fR +prior to 1.8.15 do not have this restriction. +Users are never allowed to edit device special files. +.sp If the specified file does not exist, it will be created. Note that unlike most commands run by \fIsudo\fR, diff --git a/doc/sudo.mdoc.in b/doc/sudo.mdoc.in index 23ed9f020..89ceee0d6 100644 --- a/doc/sudo.mdoc.in +++ b/doc/sudo.mdoc.in @@ -19,7 +19,7 @@ .\" Agency (DARPA) and Air Force Research Laboratory, Air Force .\" Materiel Command, USAF, under agreement number F39502-99-1-0512. .\" -.Dd July 10, 2015 +.Dd August 6, 2015 .Dt SUDO @mansectsu@ .Os Sudo @PACKAGE_VERSION@ .Sh NAME @@ -265,6 +265,15 @@ If they have been modified, the temporary files are copied back to their original location and the temporary versions are removed. .El .Pp +Unless explicitly allowed by the security policy, symbolic links +will not be opened. +This helps prevent the editing of unauthorized files when the file +is located in a user-writable directory. +Versions of +.Nm +prior to 1.8.15 do not have this restriction. +Users are never allowed to edit device special files. +.Pp If the specified file does not exist, it will be created. Note that unlike most commands run by .Em sudo , diff --git a/doc/sudo_plugin.cat b/doc/sudo_plugin.cat index ce3649b76..08923bda5 100644 --- a/doc/sudo_plugin.cat +++ b/doc/sudo_plugin.cat @@ -606,6 +606,14 @@ DDEESSCCRRIIPPTTIIOONN substitution and transparently enable _s_u_d_o_e_d_i_t when the user attempts to run an editor. + sudoedit_follow=bool + Set to true to allow ssuuddooeeddiitt to edit files that are + symbolic links. By default, ssuuddooeeddiitt 1.8.15 and higher + will refuse to open a symbolic link. The + _s_u_d_o_e_d_i_t___f_o_l_l_o_w option can be used to restore the older + behavior and allow ssuuddooeeddiitt to open symbolic links. + Only available starting with API version 1.8. + timeout=int Command timeout. If non-zero then when the timeout expires the command will be killed. @@ -1479,6 +1487,9 @@ PPLLUUGGIINN AAPPII CCHHAANNGGEELLOOGG may occur multiple times if there are multiple plugin-specific Debug lines in the sudo.conf(4) file. + Version 1.8 (sudo 1.8.15) + The _s_u_d_o_e_d_i_t___f_o_l_l_o_w entry was added to the command_info list. + SSEEEE AALLSSOO sudo.conf(4), sudoers(4), sudo(1m) @@ -1508,4 +1519,4 @@ DDIISSCCLLAAIIMMEERR file distributed with ssuuddoo or http://www.sudo.ws/license.html for complete details. -Sudo 1.8.14 December 4, 2014 Sudo 1.8.14 +Sudo 1.8.15 August 6, 2015 Sudo 1.8.15 diff --git a/doc/sudo_plugin.man.in b/doc/sudo_plugin.man.in index 79ea1d898..dc65bd4f3 100644 --- a/doc/sudo_plugin.man.in +++ b/doc/sudo_plugin.man.in @@ -16,7 +16,7 @@ .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.TH "SUDO_PLUGIN" "5" "December 4, 2014" "Sudo @PACKAGE_VERSION@" "File Formats Manual" +.TH "SUDO_PLUGIN" "5" "August 6, 2015" "Sudo @PACKAGE_VERSION@" "File Formats Manual" .nh .if n .ad l .SH "NAME" @@ -999,6 +999,20 @@ enable \fIsudoedit\fR when the user attempts to run an editor. .TP 6n +sudoedit_follow=bool +Set to true to allow +\fBsudoedit\fR +to edit files that are symbolic links. +By default, +\fBsudoedit\fR +1.8.15 and higher will refuse to open a symbolic link. +The +\fIsudoedit_follow\fR +option can be used to restore the older behavior and allow +\fBsudoedit\fR +to open symbolic links. +Only available starting with API version 1.8. +.TP 6n timeout=int Command timeout. If non-zero then when the timeout expires the command will be killed. @@ -2641,6 +2655,13 @@ The entry now starts with a debug file path name and may occur multiple times if there are multiple plugin-specific Debug lines in the sudo.conf(@mansectform@) file. +.TP 6n +Version 1.8 (sudo 1.8.15) +The +\fIsudoedit_follow\fR +entry was added to the +\fRcommand_info\fR +list. .SH "SEE ALSO" sudo.conf(@mansectform@), sudoers(@mansectform@), diff --git a/doc/sudo_plugin.mdoc.in b/doc/sudo_plugin.mdoc.in index edb3970c9..951bdfb62 100644 --- a/doc/sudo_plugin.mdoc.in +++ b/doc/sudo_plugin.mdoc.in @@ -14,7 +14,7 @@ .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd December 4, 2014 +.Dd August 6, 2015 .Dt SUDO_PLUGIN @mansectform@ .Os Sudo @PACKAGE_VERSION@ .Sh NAME @@ -881,6 +881,19 @@ This allows the plugin to perform command substitution and transparently enable .Em sudoedit when the user attempts to run an editor. +.It sudoedit_follow=bool +Set to true to allow +.Nm sudoedit +to edit files that are symbolic links. +By default, +.Nm sudoedit +1.8.15 and higher will refuse to open a symbolic link. +The +.Em sudoedit_follow +option can be used to restore the older behavior and allow +.Nm sudoedit +to open symbolic links. +Only available starting with API version 1.8. .It timeout=int Command timeout. If non-zero then when the timeout expires the command will be killed. @@ -2310,6 +2323,12 @@ The entry now starts with a debug file path name and may occur multiple times if there are multiple plugin-specific Debug lines in the .Xr sudo.conf @mansectform@ file. +.It Version 1.8 (sudo 1.8.15) +The +.Em sudoedit_follow +entry was added to the +.Li command_info +list. .El .Sh SEE ALSO .Xr sudo.conf @mansectform@ , diff --git a/doc/sudoers.cat b/doc/sudoers.cat index cd73fa5a7..c47edcc99 100644 --- a/doc/sudoers.cat +++ b/doc/sudoers.cat @@ -465,9 +465,10 @@ SSUUDDOOEERRSS FFIILLEE FFOORRMMAATT Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset') - Tag_Spec ::= ('NOEXEC:' | 'EXEC:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | - 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | - 'NOPASSWD:' | 'PASSWD:' | 'SETENV:' | 'NOSETENV:') + Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' | + 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | + 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' | + 'NOPASSWD:' | 'SETENV:' | 'NOSETENV:') A uusseerr ssppeecciiffiiccaattiioonn determines which commands a user may run (and as what user) on specified hosts. By default, commands are run as rroooott, but @@ -581,13 +582,14 @@ SSUUDDOOEERRSS FFIILLEE FFOORRMMAATT TTaagg__SSppeecc A command may have zero or more tags associated with it. There are ten - possible tag values: NOEXEC, EXEC, LOG_INPUT, NOLOG_INPUT, LOG_OUTPUT, - NOLOG_OUTPUT, MAIL, NOMAIL, NOPASSWD, PASSWD, SETENV, and NOSETENV. Once - a tag is set on a Cmnd, subsequent Cmnds in the Cmnd_Spec_List, inherit - the tag unless it is overridden by the opposite tag (in other words, - PASSWD overrides NOPASSWD and NOEXEC overrides EXEC). + possible tag values: EXEC, NOEXEC, FOLLOW, NOFOLLOW, LOG_INPUT, + NOLOG_INPUT, LOG_OUTPUT, NOLOG_OUTPUT, MAIL, NOMAIL, PASSWD, NOPASSWD, + SETENV, and NOSETENV. Once a tag is set on a Cmnd, subsequent Cmnds in + the Cmnd_Spec_List, inherit the tag unless it is overridden by the + opposite tag (in other words, PASSWD overrides NOPASSWD and NOEXEC + overrides EXEC). - _N_O_E_X_E_C and _E_X_E_C + _E_X_E_C and _N_O_E_X_E_C If ssuuddoo has been compiled with _n_o_e_x_e_c support and the underlying operating system supports it, the NOEXEC tag can be used to prevent a @@ -601,6 +603,13 @@ SSUUDDOOEERRSS FFIILLEE FFOORRMMAATT See the _P_r_e_v_e_n_t_i_n_g _s_h_e_l_l _e_s_c_a_p_e_s section below for more details on how NOEXEC works and whether or not it will work on your system. + _F_O_L_L_O_W and _N_O_F_O_L_L_O_W Starting with version 1.8.15, ssuuddooeeddiitt will not + follow symbolic links when opening files unless the _s_u_d_o_e_d_i_t___f_o_l_l_o_w + option is enabled. The _F_O_L_L_O_W and _N_O_F_O_L_L_O_W tags override the value of + _s_u_d_o_e_d_i_t___f_o_l_l_o_w and can be used to permit (or deny) the editing of + symbolic links on a per-command basis. These tags are only effective + for the _s_u_d_o_e_d_i_t command and are ignored for all other commands. + _L_O_G___I_N_P_U_T and _N_O_L_O_G___I_N_P_U_T These tags override the value of the _l_o_g___i_n_p_u_t option on a per-command @@ -623,7 +632,7 @@ SSUUDDOOEERRSS FFIILLEE FFOORRMMAATT the descriptions of _m_a_i_l___a_l_l___c_m_n_d_s, _m_a_i_l___a_l_w_a_y_s, and _m_a_i_l___n_o___p_e_r_m_s in the _S_U_D_O_E_R_S _O_P_T_I_O_N_S section below. - _N_O_P_A_S_S_W_D and _P_A_S_S_W_D + _P_A_S_S_W_D and _N_O_P_A_S_S_W_D By default, ssuuddoo requires that a user authenticate him or herself before running a command. This behavior can be modified via the @@ -1248,6 +1257,15 @@ SSUUDDOOEERRSS OOPPTTIIOONNSS that support either the setreuid(2) or setresuid(2) system call. This flag is _o_f_f by default. + sudoedit_follow By default, ssuuddooeeddiitt will not follow symbolic links + when opening files. The _s_u_d_o_e_d_i_t___f_o_l_l_o_w option can be + enabled to allow ssuuddooeeddiitt to open symbolic links. It + may be overridden on a per-command basis by the _F_O_L_L_O_W + and _N_O_F_O_L_L_O_W tags. This flag is _o_f_f by default. + + This setting is only supported by version 1.8.15 or + higher. + targetpw If set, ssuuddoo will prompt for the password of the user specified by the --uu option (defaults to root) instead of the password of the invoking user when running a @@ -2417,4 +2435,4 @@ DDIISSCCLLAAIIMMEERR file distributed with ssuuddoo or http://www.sudo.ws/license.html for complete details. -Sudo 1.8.14 August 4, 2015 Sudo 1.8.14 +Sudo 1.8.15 August 6, 2015 Sudo 1.8.15 diff --git a/doc/sudoers.man.in b/doc/sudoers.man.in index 103ddb577..d4c120b3f 100644 --- a/doc/sudoers.man.in +++ b/doc/sudoers.man.in @@ -21,7 +21,7 @@ .\" Agency (DARPA) and Air Force Research Laboratory, Air Force .\" Materiel Command, USAF, under agreement number F39502-99-1-0512. .\" -.TH "SUDOERS" "5" "August 4, 2015" "Sudo @PACKAGE_VERSION@" "File Formats Manual" +.TH "SUDOERS" "5" "August 6, 2015" "Sudo @PACKAGE_VERSION@" "File Formats Manual" .nh .if n .ad l .SH "NAME" @@ -961,9 +961,10 @@ SELinux_Spec ::= ('ROLE=role' | 'TYPE=type') Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset') -Tag_Spec ::= ('NOEXEC:' | 'EXEC:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | - 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | - 'NOPASSWD:' | 'PASSWD:' | 'SETENV:' | 'NOSETENV:') +Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' | + 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | + 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' | + 'NOPASSWD:' | 'SETENV:' | 'NOSETENV:') .RE .fi .PP @@ -1214,16 +1215,18 @@ character. A command may have zero or more tags associated with it. There are ten possible tag values: -\fRNOEXEC\fR, \fREXEC\fR, +\fRNOEXEC\fR, +\fRFOLLOW\fR, +\fRNOFOLLOW\fR, \fRLOG_INPUT\fR, \fRNOLOG_INPUT\fR, \fRLOG_OUTPUT\fR, \fRNOLOG_OUTPUT\fR, \fRMAIL\fR, \fRNOMAIL\fR, -\fRNOPASSWD\fR, \fRPASSWD\fR, +\fRNOPASSWD\fR, \fRSETENV\fR, and \fRNOSETENV\fR. @@ -1242,7 +1245,7 @@ and overrides \fREXEC\fR). .TP 2n -\fINOEXEC\fR and \fIEXEC\fR +\fIEXEC\fR and \fINOEXEC\fR .sp If \fBsudo\fR @@ -1275,6 +1278,24 @@ section below for more details on how works and whether or not it will work on your system. .RE .TP 2n +\fIFOLLOW\fR and \fINOFOLLOW\fR +Starting with version 1.8.15, +\fBsudoedit\fR +will not follow symbolic links when opening files unless the +\fIsudoedit_follow\fR +option is enabled. +The +\fIFOLLOW\fR +and +\fINOFOLLOW\fR +tags override the value of +\fIsudoedit_follow\fR +and can be used to permit (or deny) the editing of symbolic links +on a per-command basis. +These tags are only effective for the +\fIsudoedit\fR +command and are ignored for all other commands. +.TP 2n \fILOG_INPUT\fR and \fINOLOG_INPUT\fR .sp These tags override the value of the @@ -1327,7 +1348,7 @@ in the \fISUDOERS OPTIONS\fR section below. .TP 2n -\fINOPASSWD\fR and \fIPASSWD\fR +\fIPASSWD\fR and \fINOPASSWD\fR .sp By default, \fBsudo\fR @@ -2660,6 +2681,26 @@ This flag is \fIoff\fR by default. .TP 18n +sudoedit_follow +By default, +\fBsudoedit\fR +will not follow symbolic links when opening files. +The +\fIsudoedit_follow\fR +option can be enabled to allow +\fBsudoedit\fR +to open symbolic links. +It may be overridden on a per-command basis by the +\fIFOLLOW\fR +and +\fINOFOLLOW\fR +tags. +This flag is +\fIoff\fR +by default. +.sp +This setting is only supported by version 1.8.15 or higher. +.TP 18n targetpw If set, \fBsudo\fR diff --git a/doc/sudoers.mdoc.in b/doc/sudoers.mdoc.in index 055c9ce1a..54275d735 100644 --- a/doc/sudoers.mdoc.in +++ b/doc/sudoers.mdoc.in @@ -19,7 +19,7 @@ .\" Agency (DARPA) and Air Force Research Laboratory, Air Force .\" Materiel Command, USAF, under agreement number F39502-99-1-0512. .\" -.Dd August 4, 2015 +.Dd August 6, 2015 .Dt SUDOERS @mansectform@ .Os Sudo @PACKAGE_VERSION@ .Sh NAME @@ -914,9 +914,10 @@ SELinux_Spec ::= ('ROLE=role' | 'TYPE=type') Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset') -Tag_Spec ::= ('NOEXEC:' | 'EXEC:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | - 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | - 'NOPASSWD:' | 'PASSWD:' | 'SETENV:' | 'NOSETENV:') +Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' | + 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | + 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' | + 'NOPASSWD:' | 'SETENV:' | 'NOSETENV:') .Ed .Pp A @@ -1137,16 +1138,18 @@ character. A command may have zero or more tags associated with it. There are ten possible tag values: -.Li NOEXEC , .Li EXEC , +.Li NOEXEC , +.Li FOLLOW , +.Li NOFOLLOW , .Li LOG_INPUT , .Li NOLOG_INPUT , .Li LOG_OUTPUT , .Li NOLOG_OUTPUT , .Li MAIL , .Li NOMAIL , -.Li NOPASSWD , .Li PASSWD , +.Li NOPASSWD , .Li SETENV , and .Li NOSETENV . @@ -1165,7 +1168,7 @@ and overrides .Li EXEC ) . .Bl -hang -width 0n -.It Em NOEXEC No and Em EXEC +.It Em EXEC No and Em NOEXEC .sp If .Nm sudo @@ -1192,6 +1195,23 @@ See the section below for more details on how .Li NOEXEC works and whether or not it will work on your system. +.It Em FOLLOW No and Em NOFOLLOW +Starting with version 1.8.15, +.Nm sudoedit +will not follow symbolic links when opening files unless the +.Em sudoedit_follow +option is enabled. +The +.Em FOLLOW +and +.Em NOFOLLOW +tags override the value of +.Em sudoedit_follow +and can be used to permit (or deny) the editing of symbolic links +on a per-command basis. +These tags are only effective for the +.Em sudoedit +command and are ignored for all other commands. .It Em LOG_INPUT No and Em NOLOG_INPUT .sp These tags override the value of the @@ -1241,7 +1261,7 @@ and in the .Sx SUDOERS OPTIONS section below. -.It Em NOPASSWD No and Em PASSWD +.It Em PASSWD No and Em NOPASSWD .sp By default, .Nm sudo @@ -2493,6 +2513,25 @@ system call. This flag is .Em off by default. +.It sudoedit_follow +By default, +.Nm sudoedit +will not follow symbolic links when opening files. +The +.Em sudoedit_follow +option can be enabled to allow +.Nm sudoedit +to open symbolic links. +It may be overridden on a per-command basis by the +.Em FOLLOW +and +.Em NOFOLLOW +tags. +This flag is +.Em off +by default. +.Pp +This setting is only supported by version 1.8.15 or higher. .It targetpw If set, .Nm sudo diff --git a/include/sudo_compat.h b/include/sudo_compat.h index a808eef66..7fb234eef 100644 --- a/include/sudo_compat.h +++ b/include/sudo_compat.h @@ -170,6 +170,9 @@ #ifndef S_ISDIR # define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) #endif /* S_ISDIR */ +#ifndef S_ISLNK +# define S_ISLNK(m) (((m) & _S_IFMT) == _S_IFLNK) +#endif /* S_ISLNK */ /* For futimens() and utimensat() emulation. */ #if !defined(HAVE_FUTIMENS) && !defined(HAVE_UTIMENSAT) diff --git a/include/sudo_plugin.h b/include/sudo_plugin.h index de1592632..aa5258c1c 100644 --- a/include/sudo_plugin.h +++ b/include/sudo_plugin.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2014 Todd C. Miller + * Copyright (c) 2009-2015 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -19,7 +19,7 @@ /* API version major/minor */ #define SUDO_API_VERSION_MAJOR 1 -#define SUDO_API_VERSION_MINOR 7 +#define SUDO_API_VERSION_MINOR 8 #define SUDO_API_MKVERSION(x, y) ((x << 16) | y) #define SUDO_API_VERSION SUDO_API_MKVERSION(SUDO_API_VERSION_MAJOR, SUDO_API_VERSION_MINOR) diff --git a/plugins/sudoers/def_data.c b/plugins/sudoers/def_data.c index 37cf62ac8..40c509a59 100644 --- a/plugins/sudoers/def_data.c +++ b/plugins/sudoers/def_data.c @@ -386,6 +386,10 @@ struct sudo_defs_types sudo_defs_table[] = { "use_netgroups", T_FLAG, N_("Enable sudoers netgroup support"), NULL, + }, { + "sudoedit_follow", T_FLAG, + N_("Follow symbolic links when editing files with sudoedit"), + NULL, }, { NULL, 0, NULL } diff --git a/plugins/sudoers/def_data.h b/plugins/sudoers/def_data.h index c14526af7..7fbe1d804 100644 --- a/plugins/sudoers/def_data.h +++ b/plugins/sudoers/def_data.h @@ -180,6 +180,8 @@ #define I_MAXSEQ 89 #define def_use_netgroups (sudo_defs_table[90].sd_un.flag) #define I_USE_NETGROUPS 90 +#define def_sudoedit_follow (sudo_defs_table[91].sd_un.flag) +#define I_SUDOEDIT_FOLLOW 91 enum def_tuple { never, diff --git a/plugins/sudoers/def_data.in b/plugins/sudoers/def_data.in index c0a10ecfb..55a2126ad 100644 --- a/plugins/sudoers/def_data.in +++ b/plugins/sudoers/def_data.in @@ -286,3 +286,6 @@ maxseq use_netgroups T_FLAG "Enable sudoers netgroup support" +sudoedit_follow + T_FLAG + "Follow symbolic links when editing files with sudoedit" diff --git a/plugins/sudoers/gram.c b/plugins/sudoers/gram.c index 35bdfe160..301cf73ae 100644 --- a/plugins/sudoers/gram.c +++ b/plugins/sudoers/gram.c @@ -150,22 +150,24 @@ typedef union { #define NOLOG_OUTPUT 279 #define MAIL 280 #define NOMAIL 281 -#define ALL 282 -#define COMMENT 283 -#define HOSTALIAS 284 -#define CMNDALIAS 285 -#define USERALIAS 286 -#define RUNASALIAS 287 -#define ERROR 288 -#define TYPE 289 -#define ROLE 290 -#define PRIVS 291 -#define LIMITPRIVS 292 -#define MYSELF 293 -#define SHA224_TOK 294 -#define SHA256_TOK 295 -#define SHA384_TOK 296 -#define SHA512_TOK 297 +#define FOLLOW 282 +#define NOFOLLOW 283 +#define ALL 284 +#define COMMENT 285 +#define HOSTALIAS 286 +#define CMNDALIAS 287 +#define USERALIAS 288 +#define RUNASALIAS 289 +#define ERROR 290 +#define TYPE 291 +#define ROLE 292 +#define PRIVS 293 +#define LIMITPRIVS 294 +#define MYSELF 295 +#define SHA224_TOK 296 +#define SHA256_TOK 297 +#define SHA384_TOK 298 +#define SHA512_TOK 299 #define YYERRCODE 256 #if defined(__cplusplus) || defined(__STDC__) const short sudoerslhs[] = @@ -180,11 +182,11 @@ short sudoerslhs[] = 7, 7, 6, 6, 24, 25, 23, 23, 23, 23, 23, 27, 28, 26, 26, 26, 26, 26, 18, 18, 19, 19, 19, 19, 19, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 5, 5, - 5, 33, 33, 36, 10, 10, 34, 34, 37, 8, - 8, 35, 35, 38, 32, 32, 39, 14, 14, 12, - 12, 13, 13, 13, 13, 13, 17, 17, 15, 15, - 16, 16, 16, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 5, 5, 5, 33, 33, 36, 10, 10, 34, 34, + 37, 8, 8, 35, 35, 38, 32, 32, 39, 14, + 14, 12, 12, 13, 13, 13, 13, 13, 17, 17, + 15, 15, 16, 16, 16, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoerslen[] = @@ -199,11 +201,11 @@ short sudoerslen[] = 1, 2, 1, 2, 3, 3, 0, 1, 1, 2, 2, 3, 3, 0, 1, 1, 2, 2, 0, 3, 0, 1, 3, 2, 1, 0, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, - 1, 1, 3, 3, 1, 3, 1, 3, 3, 1, - 3, 1, 3, 3, 1, 3, 3, 1, 3, 1, - 2, 1, 1, 1, 1, 1, 1, 3, 1, 2, - 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 3, 3, 1, 3, 1, 3, + 3, 1, 3, 1, 3, 3, 1, 3, 3, 1, + 3, 1, 2, 1, 1, 1, 1, 1, 1, 3, + 1, 2, 1, 1, 1, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoersdefred[] = @@ -211,24 +213,24 @@ const short sudoersdefred[] = short sudoersdefred[] = #endif { 0, - 0, 102, 104, 105, 106, 0, 0, 0, 0, 0, - 103, 5, 0, 0, 0, 0, 0, 0, 98, 100, + 0, 104, 106, 107, 108, 0, 0, 0, 0, 0, + 105, 5, 0, 0, 0, 0, 0, 0, 100, 102, 0, 0, 3, 6, 0, 0, 17, 0, 29, 32, - 31, 33, 30, 0, 27, 0, 85, 0, 0, 81, - 80, 79, 0, 0, 0, 0, 0, 43, 41, 90, - 0, 0, 0, 0, 82, 0, 0, 87, 0, 0, - 95, 0, 0, 92, 101, 0, 0, 24, 0, 4, + 31, 33, 30, 0, 27, 0, 87, 0, 0, 83, + 82, 81, 0, 0, 0, 0, 0, 43, 41, 92, + 0, 0, 0, 0, 84, 0, 0, 89, 0, 0, + 97, 0, 0, 94, 103, 0, 0, 24, 0, 4, 0, 0, 0, 20, 0, 28, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 42, 0, 0, - 0, 0, 0, 0, 0, 0, 99, 0, 0, 21, - 22, 23, 18, 86, 37, 38, 39, 40, 91, 0, - 83, 0, 88, 0, 96, 0, 93, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 101, 0, 0, 21, + 22, 23, 18, 88, 37, 38, 39, 40, 93, 0, + 85, 0, 90, 0, 98, 0, 95, 0, 34, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 111, 113, 112, 0, 107, 109, 0, 0, 60, + 0, 113, 115, 114, 0, 109, 111, 0, 0, 60, 35, 0, 0, 0, 0, 66, 0, 0, 50, 51, - 110, 0, 0, 46, 45, 0, 0, 0, 57, 58, - 108, 52, 53, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 36, + 112, 0, 0, 46, 45, 0, 0, 0, 57, 58, + 110, 52, 53, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 79, 80, 77, 78, 36, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoersdgoto[] = @@ -246,294 +248,276 @@ const short sudoerssindex[] = #else short sudoerssindex[] = #endif - { 780, - -268, 0, 0, 0, 0, -28, -11, 47, 47, -21, - 0, 0, -237, -226, -222, -205, -235, 0, 0, 0, - -31, 780, 0, 0, 3, -242, 0, 12, 0, 0, - 0, 0, 0, -221, 0, -26, 0, -25, -25, 0, - 0, 0, -247, -1, 2, 4, 5, 0, 0, 0, - -24, -4, -3, 10, 0, -2, 11, 0, 9, 13, - 0, 14, 15, 0, 0, 47, -30, 0, 18, 0, - -191, -189, -186, 0, -28, 0, -11, 12, 12, 12, - 0, -185, -183, -181, -180, -21, 12, 0, -11, -237, - -21, -226, 47, -222, 47, -205, 0, 45, -11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, - 0, 43, 0, 48, 0, 48, 0, -17, 0, 49, - -246, 0, 79, -20, 53, 45, 28, 34, -241, -193, - -190, 0, 0, 0, -233, 0, 0, 55, 79, 0, - 0, -162, -161, 44, 46, 0, -188, -182, 0, 0, - 0, 79, 55, 0, 0, -160, -157, 625, 0, 0, + { 686, + -272, 0, 0, 0, 0, -23, 227, -19, -19, -5, + 0, 0, -239, -236, -234, -232, -231, 0, 0, 0, + -33, 686, 0, 0, -3, -220, 0, 3, 0, 0, + 0, 0, 0, -225, 0, -28, 0, -24, -24, 0, + 0, 0, -240, -15, -8, 2, 8, 0, 0, 0, + -21, -12, -9, 10, 0, 9, 13, 0, 11, 16, + 0, 14, 19, 0, 0, -19, -36, 0, 20, 0, + -208, -187, -183, 0, -23, 0, 227, 3, 3, 3, + 0, -181, -180, -179, -178, -5, 3, 0, 227, -239, + -5, -236, -19, -234, -19, -232, 0, 41, 227, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, + 0, 47, 0, 48, 0, 48, 0, -29, 0, 50, + -230, 0, 289, -7, 52, 41, 34, 37, -229, -192, + -191, 0, 0, 0, -217, 0, 0, 56, 289, 0, + 0, -161, -160, 43, 44, 0, -188, -185, 0, 0, + 0, 289, 56, 0, 0, -154, -153, 533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,}; + 0, 0, 0, 0, 0, 0, 0, 0,}; #if defined(__cplusplus) || defined(__STDC__) const short sudoersrindex[] = #else short sudoersrindex[] = #endif - { 108, + { 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 110, 0, 0, 1, 0, 0, 193, 0, 0, + 0, 114, 0, 0, 1, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 225, 0, 0, 260, 0, 0, 292, - 0, 0, 324, 0, 0, 0, 0, 0, 356, 0, - 0, 0, 0, 0, 0, 0, 0, 388, 420, 452, - 0, 0, 0, 0, 0, 0, 484, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, - 0, 65, 0, 97, 0, 129, 0, 70, 0, 161, - 530, 0, 73, 74, 0, 502, 0, 0, 657, 561, - 593, 0, 0, 0, 0, 0, 0, 75, 0, 0, - 0, 0, 0, 0, 0, 0, 689, 721, 0, 0, - 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 159, 0, 0, 193, 0, 0, 207, + 0, 0, 241, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 0, 0, 309, 323, 357, + 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 0, 49, 0, 63, 0, 97, 0, 74, 0, 111, + 434, 0, 75, 76, 0, 404, 0, 0, 566, 465, + 499, 0, 0, 0, 0, 0, 0, 77, 0, 0, + 0, 0, 0, 0, 0, 0, 597, 630, 0, 0, + 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,}; + 0, 0, 0, 0, 0, 0, 0, 0,}; #if defined(__cplusplus) || defined(__STDC__) const short sudoersgindex[] = #else short sudoersgindex[] = #endif { 0, - -8, 0, 50, 16, 77, 67, -80, 30, 88, -7, - 51, 58, 109, -5, -19, 6, -12, 0, 0, 32, - 0, 0, 0, 7, 17, 0, -16, -13, 0, 0, - 113, 0, 0, 0, 0, 52, 54, 40, 56, + -4, 0, 45, 18, 80, 72, -79, 35, 91, -1, + 51, 61, 112, -6, -20, -2, 4, 0, 0, 32, + 0, 0, 0, 5, 7, 0, -14, 6, 0, 0, + 116, 0, 0, 0, 0, 57, 54, 39, 55, }; -#define YYTABLESIZE 1067 +#define YYTABLESIZE 975 #if defined(__cplusplus) || defined(__STDC__) const short sudoerstable[] = #else short sudoerstable[] = #endif - { 36, - 19, 34, 38, 39, 26, 109, 26, 26, 26, 40, - 41, 43, 66, 77, 24, 17, 74, 77, 66, 86, - 53, 34, 2, 66, 132, 3, 4, 5, 43, 133, - 98, 56, 84, 19, 42, 59, 29, 139, 30, 31, - 123, 32, 127, 128, 19, 72, 11, 73, 134, 144, - 145, 78, 62, 79, 80, 75, 82, 89, 91, 83, - 33, 84, 85, 71, 89, 84, 87, 90, 92, 93, - 94, 100, 96, 101, 95, 99, 102, 176, 105, 17, - 106, 110, 107, 108, 118, 77, 86, 114, 142, 116, - 84, 66, 126, 140, 143, 127, 97, 89, 152, 128, - 154, 155, 162, 145, 156, 163, 157, 1, 144, 2, - 61, 135, 124, 65, 62, 64, 63, 141, 88, 81, - 112, 76, 89, 97, 103, 65, 153, 104, 94, 97, - 122, 160, 161, 159, 70, 117, 0, 150, 0, 0, - 151, 111, 0, 0, 0, 113, 149, 0, 0, 115, - 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, - 26, 94, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, - 0, 0, 12, 26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + { 34, + 19, 38, 39, 17, 26, 36, 109, 77, 26, 26, + 66, 26, 24, 17, 86, 77, 40, 41, 53, 66, + 43, 56, 86, 59, 98, 62, 2, 43, 123, 3, + 4, 5, 29, 19, 30, 31, 66, 32, 74, 72, + 132, 73, 82, 42, 19, 133, 75, 86, 91, 83, + 139, 89, 11, 78, 100, 79, 80, 71, 33, 84, + 127, 128, 99, 144, 145, 85, 134, 90, 87, 91, + 92, 93, 86, 94, 95, 101, 96, 99, 178, 102, + 118, 91, 105, 106, 107, 108, 114, 110, 116, 77, + 86, 66, 140, 126, 142, 99, 96, 143, 127, 152, + 128, 154, 155, 156, 157, 145, 91, 144, 162, 163, + 26, 124, 1, 2, 61, 65, 62, 64, 63, 103, + 99, 141, 81, 88, 76, 112, 97, 104, 65, 96, + 122, 161, 151, 160, 117, 150, 149, 70, 0, 0, + 0, 0, 153, 26, 12, 113, 111, 0, 115, 0, + 0, 0, 159, 0, 96, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, - 0, 0, 0, 0, 9, 12, 29, 0, 30, 31, - 25, 32, 25, 25, 25, 40, 41, 0, 0, 0, - 2, 0, 0, 3, 4, 5, 29, 0, 30, 31, - 33, 32, 40, 41, 0, 0, 19, 9, 19, 10, - 42, 19, 19, 19, 11, 19, 19, 19, 19, 19, - 33, 0, 44, 45, 46, 47, 0, 42, 0, 0, - 0, 0, 19, 19, 19, 19, 19, 19, 84, 0, - 84, 8, 10, 84, 84, 84, 0, 84, 84, 84, - 84, 84, 0, 0, 2, 0, 0, 3, 4, 5, - 0, 0, 0, 0, 84, 84, 84, 84, 84, 84, - 89, 0, 89, 11, 8, 89, 89, 89, 11, 89, - 89, 89, 89, 89, 0, 0, 132, 0, 0, 0, - 0, 133, 0, 0, 0, 0, 89, 89, 89, 89, - 89, 89, 97, 0, 97, 7, 11, 97, 97, 97, - 134, 97, 97, 97, 97, 97, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, - 97, 97, 97, 97, 94, 0, 94, 15, 7, 94, - 94, 94, 0, 94, 94, 94, 94, 94, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 94, 94, 94, 94, 94, 94, 26, 0, 26, 13, - 15, 26, 26, 26, 0, 26, 26, 26, 26, 26, + 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 26, 26, 26, 26, 26, 12, 0, - 12, 14, 13, 12, 12, 12, 0, 12, 12, 12, - 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, - 9, 0, 9, 16, 14, 9, 9, 9, 0, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 10, 16, 10, 0, 0, - 10, 10, 10, 0, 10, 10, 10, 10, 10, 0, - 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, - 0, 10, 10, 10, 10, 10, 10, 8, 0, 8, - 0, 0, 8, 8, 8, 0, 8, 8, 8, 8, - 8, 0, 47, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 8, 8, 8, 8, 8, 11, - 0, 11, 0, 0, 11, 11, 11, 0, 11, 11, - 11, 11, 11, 48, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, - 11, 7, 0, 7, 0, 0, 7, 7, 7, 0, - 7, 7, 7, 7, 7, 49, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, - 7, 7, 7, 15, 0, 15, 0, 0, 15, 15, - 15, 0, 15, 15, 15, 15, 15, 43, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 15, 15, 15, 15, 15, 13, 0, 13, 0, 0, - 13, 13, 13, 0, 13, 13, 13, 13, 13, 54, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 13, 13, 13, 13, 13, 14, 0, 14, - 0, 0, 14, 14, 14, 0, 14, 14, 14, 14, - 14, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 14, 14, 14, 14, 14, 14, 16, - 0, 16, 0, 0, 16, 16, 16, 0, 16, 16, - 16, 16, 16, 56, 0, 0, 0, 0, 59, 59, - 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, - 16, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 0, 0, 47, 47, 0, 0, - 59, 59, 59, 59, 0, 59, 59, 59, 59, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 17, 0, 0, 0, 0, 48, 48, 0, - 47, 47, 0, 47, 47, 47, 47, 0, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 0, 0, 0, 49, - 49, 48, 48, 0, 48, 48, 48, 48, 0, 0, - 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 0, 0, 0, 0, 0, - 0, 40, 41, 49, 49, 0, 49, 49, 49, 49, - 0, 0, 0, 0, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 42, 0, 0, 0, - 0, 0, 0, 54, 54, 0, 0, 0, 44, 45, - 46, 47, 0, 0, 0, 0, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, - 0, 0, 0, 0, 0, 55, 55, 0, 0, 0, - 54, 54, 54, 54, 0, 0, 0, 0, 55, 55, + 0, 0, 0, 0, 29, 10, 30, 31, 2, 32, + 25, 3, 4, 5, 25, 25, 0, 25, 2, 8, + 11, 3, 4, 5, 40, 41, 0, 0, 0, 0, + 33, 40, 41, 0, 11, 0, 19, 0, 19, 34, + 0, 19, 19, 19, 11, 19, 19, 19, 19, 19, + 86, 42, 86, 11, 7, 86, 86, 86, 42, 86, + 86, 86, 86, 86, 19, 19, 19, 19, 19, 19, + 44, 45, 46, 47, 0, 0, 0, 0, 86, 86, + 86, 86, 86, 86, 91, 0, 91, 7, 15, 91, + 91, 91, 0, 91, 91, 91, 91, 91, 99, 0, + 99, 135, 13, 99, 99, 99, 0, 99, 99, 99, + 99, 99, 91, 91, 91, 91, 91, 91, 0, 0, + 0, 15, 0, 0, 0, 0, 99, 99, 99, 99, + 99, 99, 96, 0, 96, 13, 14, 96, 96, 96, + 0, 96, 96, 96, 96, 96, 26, 0, 26, 0, + 16, 26, 26, 26, 0, 26, 26, 26, 26, 26, + 96, 96, 96, 96, 96, 96, 0, 0, 0, 14, + 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, + 12, 0, 12, 16, 0, 12, 12, 12, 0, 12, + 12, 12, 12, 12, 9, 0, 9, 0, 0, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 12, 12, + 12, 12, 12, 12, 0, 0, 59, 0, 0, 0, + 0, 0, 9, 9, 9, 9, 9, 9, 10, 0, + 10, 0, 0, 10, 10, 10, 0, 10, 10, 10, + 10, 10, 8, 0, 8, 0, 47, 8, 8, 8, + 0, 8, 8, 8, 8, 8, 10, 10, 10, 10, + 10, 10, 0, 0, 29, 0, 30, 31, 0, 32, + 8, 8, 8, 8, 8, 8, 11, 48, 11, 0, + 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, + 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, + 7, 49, 7, 0, 0, 7, 7, 7, 0, 7, + 7, 7, 7, 7, 0, 0, 132, 0, 0, 0, + 0, 133, 0, 0, 0, 0, 0, 0, 7, 7, + 7, 7, 7, 7, 15, 43, 15, 0, 0, 15, + 15, 15, 134, 15, 15, 15, 15, 15, 13, 0, + 13, 0, 0, 13, 13, 13, 0, 13, 13, 13, + 13, 13, 15, 15, 15, 15, 15, 15, 54, 0, + 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, + 13, 13, 14, 0, 14, 0, 0, 14, 14, 14, + 0, 14, 14, 14, 14, 14, 16, 0, 16, 55, + 0, 16, 16, 16, 0, 16, 16, 16, 16, 16, + 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, + 59, 59, 56, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 0, 0, + 47, 47, 0, 0, 59, 59, 59, 59, 0, 59, + 59, 59, 59, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 17, 0, + 0, 48, 48, 0, 0, 0, 47, 47, 0, 47, + 47, 47, 47, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, + 0, 0, 0, 0, 0, 49, 49, 48, 48, 0, + 48, 48, 48, 48, 0, 0, 0, 0, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 0, 0, 0, 0, 0, 0, 40, + 41, 49, 49, 0, 49, 49, 49, 49, 0, 0, + 0, 0, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 42, 0, 0, 0, + 0, 0, 54, 54, 0, 0, 0, 0, 44, 45, + 46, 47, 0, 0, 0, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 0, 0, 0, 55, 55, 0, 0, 0, 0, 0, + 0, 54, 54, 54, 54, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 0, 0, 56, 56, 0, - 0, 0, 55, 55, 55, 55, 0, 0, 0, 0, + 55, 0, 0, 0, 0, 0, 56, 56, 0, 0, + 0, 0, 55, 55, 55, 55, 0, 0, 0, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 56, 56, 56, 56, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, - 3, 4, 5, 0, 6, 7, 8, 9, 10, 0, + 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 12, 13, 14, 15, 16, + 0, 1, 0, 2, 0, 0, 3, 4, 5, 0, + 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 12, 13, 14, 15, 16, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoerscheck[] = #else short sudoerscheck[] = #endif - { 7, - 0, 33, 8, 9, 33, 86, 33, 33, 33, 257, - 258, 33, 44, 44, 283, 33, 259, 44, 44, 44, - 258, 33, 258, 44, 258, 261, 262, 263, 33, 263, - 61, 258, 0, 33, 282, 258, 258, 58, 260, 261, - 58, 263, 289, 290, 44, 43, 282, 45, 282, 291, - 292, 36, 258, 38, 39, 44, 58, 61, 61, 58, - 282, 58, 58, 61, 0, 33, 51, 58, 58, 61, - 58, 263, 58, 263, 61, 58, 263, 158, 264, 33, - 264, 89, 264, 264, 40, 44, 44, 93, 61, 95, - 58, 44, 44, 41, 61, 289, 0, 33, 44, 290, - 263, 263, 263, 292, 61, 263, 61, 0, 291, 0, - 41, 33, 118, 41, 41, 41, 41, 126, 52, 43, - 91, 34, 58, 66, 75, 17, 139, 77, 0, 33, - 99, 148, 152, 147, 22, 96, -1, 131, -1, -1, - 135, 90, -1, -1, -1, 92, 130, -1, -1, 94, - -1, -1, -1, -1, 58, -1, -1, -1, -1, -1, - 0, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, - -1, -1, 0, 33, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + { 33, + 0, 8, 9, 33, 33, 7, 86, 44, 33, 33, + 44, 33, 285, 33, 0, 44, 257, 258, 258, 44, + 33, 258, 44, 258, 61, 258, 258, 33, 58, 261, + 262, 263, 258, 33, 260, 261, 44, 263, 259, 43, + 258, 45, 58, 284, 44, 263, 44, 33, 0, 58, + 58, 61, 284, 36, 263, 38, 39, 61, 284, 58, + 291, 292, 0, 293, 294, 58, 284, 58, 51, 61, + 58, 61, 58, 58, 61, 263, 58, 58, 158, 263, + 40, 33, 264, 264, 264, 264, 93, 89, 95, 44, + 44, 44, 41, 44, 61, 33, 0, 61, 291, 44, + 292, 263, 263, 61, 61, 294, 58, 293, 263, 263, + 0, 118, 0, 0, 41, 41, 41, 41, 41, 75, + 58, 126, 43, 52, 34, 91, 66, 77, 17, 33, + 99, 152, 135, 148, 96, 131, 130, 22, -1, -1, + -1, -1, 139, 33, 0, 92, 90, -1, 94, -1, + -1, -1, 147, -1, 58, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, - -1, -1, -1, -1, 0, 33, 258, -1, 260, 261, - 259, 263, 259, 259, 259, 257, 258, -1, -1, -1, - 258, -1, -1, 261, 262, 263, 258, -1, 260, 261, - 282, 263, 257, 258, -1, -1, 256, 33, 258, 0, - 282, 261, 262, 263, 282, 265, 266, 267, 268, 269, - 282, -1, 294, 295, 296, 297, -1, 282, -1, -1, - -1, -1, 282, 283, 284, 285, 286, 287, 256, -1, - 258, 0, 33, 261, 262, 263, -1, 265, 266, 267, - 268, 269, -1, -1, 258, -1, -1, 261, 262, 263, - -1, -1, -1, -1, 282, 283, 284, 285, 286, 287, - 256, -1, 258, 0, 33, 261, 262, 263, 282, 265, - 266, 267, 268, 269, -1, -1, 258, -1, -1, -1, - -1, 263, -1, -1, -1, -1, 282, 283, 284, 285, - 286, 287, 256, -1, 258, 0, 33, 261, 262, 263, - 282, 265, 266, 267, 268, 269, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 282, 283, - 284, 285, 286, 287, 256, -1, 258, 0, 33, 261, - 262, 263, -1, 265, 266, 267, 268, 269, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 282, 283, 284, 285, 286, 287, 256, -1, 258, 0, - 33, 261, 262, 263, -1, 265, 266, 267, 268, 269, + -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 282, 283, 284, 285, 286, 287, 256, -1, - 258, 0, 33, 261, 262, 263, -1, 265, 266, 267, - 268, 269, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 282, 283, 284, 285, 286, 287, - 256, -1, 258, 0, 33, 261, 262, 263, -1, 265, - 266, 267, 268, 269, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 282, 283, 284, 285, - 286, 287, -1, -1, -1, 256, 33, 258, -1, -1, - 261, 262, 263, -1, 265, 266, 267, 268, 269, -1, - -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, - -1, 282, 283, 284, 285, 286, 287, 256, -1, 258, - -1, -1, 261, 262, 263, -1, 265, 266, 267, 268, - 269, -1, 33, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 282, 283, 284, 285, 286, 287, 256, - -1, 258, -1, -1, 261, 262, 263, -1, 265, 266, - 267, 268, 269, 33, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 282, 283, 284, 285, 286, - 287, 256, -1, 258, -1, -1, 261, 262, 263, -1, - 265, 266, 267, 268, 269, 33, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 282, 283, 284, - 285, 286, 287, 256, -1, 258, -1, -1, 261, 262, - 263, -1, 265, 266, 267, 268, 269, 33, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 282, - 283, 284, 285, 286, 287, 256, -1, 258, -1, -1, - 261, 262, 263, -1, 265, 266, 267, 268, 269, 33, + -1, 33, 0, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 282, 283, 284, 285, 286, 287, 256, -1, 258, - -1, -1, 261, 262, 263, -1, 265, 266, 267, 268, - 269, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 282, 283, 284, 285, 286, 287, 256, - -1, 258, -1, -1, 261, 262, 263, -1, 265, 266, - 267, 268, 269, 33, -1, -1, -1, -1, 257, 258, - -1, -1, -1, -1, -1, 282, 283, 284, 285, 286, - 287, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, -1, -1, 257, 258, -1, -1, - 289, 290, 291, 292, -1, 294, 295, 296, 297, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 33, -1, -1, -1, -1, 257, 258, -1, - 291, 292, -1, 294, 295, 296, 297, -1, -1, -1, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, -1, -1, -1, -1, -1, -1, 257, - 258, 291, 292, -1, 294, 295, 296, 297, -1, -1, - -1, -1, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, -1, -1, -1, -1, -1, - -1, 257, 258, 291, 292, -1, 294, 295, 296, 297, - -1, -1, -1, -1, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, -1, -1, -1, - -1, -1, -1, 257, 258, -1, -1, -1, 294, 295, - 296, 297, -1, -1, -1, -1, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, -1, - -1, -1, -1, -1, -1, 257, 258, -1, -1, -1, - 294, 295, 296, 297, -1, -1, -1, -1, 270, 271, + -1, -1, -1, -1, 258, 33, 260, 261, 258, 263, + 259, 261, 262, 263, 259, 259, -1, 259, 258, 33, + 0, 261, 262, 263, 257, 258, -1, -1, -1, -1, + 284, 257, 258, -1, 284, -1, 256, -1, 258, 33, + -1, 261, 262, 263, 284, 265, 266, 267, 268, 269, + 256, 284, 258, 33, 0, 261, 262, 263, 284, 265, + 266, 267, 268, 269, 284, 285, 286, 287, 288, 289, + 296, 297, 298, 299, -1, -1, -1, -1, 284, 285, + 286, 287, 288, 289, 256, -1, 258, 33, 0, 261, + 262, 263, -1, 265, 266, 267, 268, 269, 256, -1, + 258, 33, 0, 261, 262, 263, -1, 265, 266, 267, + 268, 269, 284, 285, 286, 287, 288, 289, -1, -1, + -1, 33, -1, -1, -1, -1, 284, 285, 286, 287, + 288, 289, 256, -1, 258, 33, 0, 261, 262, 263, + -1, 265, 266, 267, 268, 269, 256, -1, 258, -1, + 0, 261, 262, 263, -1, 265, 266, 267, 268, 269, + 284, 285, 286, 287, 288, 289, -1, -1, -1, 33, + -1, -1, -1, -1, 284, 285, 286, 287, 288, 289, + 256, -1, 258, 33, -1, 261, 262, 263, -1, 265, + 266, 267, 268, 269, 256, -1, 258, -1, -1, 261, + 262, 263, -1, 265, 266, 267, 268, 269, 284, 285, + 286, 287, 288, 289, -1, -1, 33, -1, -1, -1, + -1, -1, 284, 285, 286, 287, 288, 289, 256, -1, + 258, -1, -1, 261, 262, 263, -1, 265, 266, 267, + 268, 269, 256, -1, 258, -1, 33, 261, 262, 263, + -1, 265, 266, 267, 268, 269, 284, 285, 286, 287, + 288, 289, -1, -1, 258, -1, 260, 261, -1, 263, + 284, 285, 286, 287, 288, 289, 256, 33, 258, -1, + -1, 261, 262, 263, -1, 265, 266, 267, 268, 269, + 284, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 284, 285, 286, 287, 288, 289, + 256, 33, 258, -1, -1, 261, 262, 263, -1, 265, + 266, 267, 268, 269, -1, -1, 258, -1, -1, -1, + -1, 263, -1, -1, -1, -1, -1, -1, 284, 285, + 286, 287, 288, 289, 256, 33, 258, -1, -1, 261, + 262, 263, 284, 265, 266, 267, 268, 269, 256, -1, + 258, -1, -1, 261, 262, 263, -1, 265, 266, 267, + 268, 269, 284, 285, 286, 287, 288, 289, 33, -1, + -1, -1, -1, -1, -1, -1, 284, 285, 286, 287, + 288, 289, 256, -1, 258, -1, -1, 261, 262, 263, + -1, 265, 266, 267, 268, 269, 256, -1, 258, 33, + -1, 261, 262, 263, -1, 265, 266, 267, 268, 269, + 284, 285, 286, 287, 288, 289, -1, -1, -1, -1, + -1, -1, -1, -1, 284, 285, 286, 287, 288, 289, + 257, 258, 33, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, -1, -1, + 257, 258, -1, -1, 291, 292, 293, 294, -1, 296, + 297, 298, 299, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 33, -1, + -1, 257, 258, -1, -1, -1, 293, 294, -1, 296, + 297, 298, 299, -1, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, -1, + -1, -1, -1, -1, -1, 257, 258, 293, 294, -1, + 296, 297, 298, 299, -1, -1, -1, -1, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, -1, -1, -1, -1, -1, -1, 257, 258, -1, - -1, -1, 294, 295, 296, 297, -1, -1, -1, -1, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 294, 295, 296, 297, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 256, -1, 258, -1, -1, - 261, 262, 263, -1, 265, 266, 267, 268, 269, -1, + 282, 283, 284, -1, -1, -1, -1, -1, -1, 257, + 258, 293, 294, -1, 296, 297, 298, 299, -1, -1, + -1, -1, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, -1, -1, -1, + -1, -1, 257, 258, -1, -1, -1, -1, 296, 297, + 298, 299, -1, -1, -1, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + -1, -1, -1, 257, 258, -1, -1, -1, -1, -1, + -1, 296, 297, 298, 299, -1, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, -1, -1, -1, -1, -1, 257, 258, -1, -1, + -1, -1, 296, 297, 298, 299, -1, -1, -1, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 296, 297, 298, 299, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 282, 283, 284, 285, 286, 287, + -1, 256, -1, 258, -1, -1, 261, 262, 263, -1, + 265, 266, 267, 268, 269, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 284, + 285, 286, 287, 288, 289, }; #define YYFINAL 18 #ifndef YYDEBUG #define YYDEBUG 0 #endif -#define YYMAXTOKEN 297 +#define YYMAXTOKEN 299 #if YYDEBUG #if defined(__cplusplus) || defined(__STDC__) const char * const sudoersname[] = @@ -551,9 +535,10 @@ char *sudoersname[] = "COMMAND","ALIAS","DEFVAR","NTWKADDR","NETGROUP","USERGROUP","WORD","DIGEST", "DEFAULTS","DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND", "NOPASSWD","PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT", -"NOLOG_INPUT","LOG_OUTPUT","NOLOG_OUTPUT","MAIL","NOMAIL","ALL","COMMENT", -"HOSTALIAS","CMNDALIAS","USERALIAS","RUNASALIAS","ERROR","TYPE","ROLE","PRIVS", -"LIMITPRIVS","MYSELF","SHA224_TOK","SHA256_TOK","SHA384_TOK","SHA512_TOK", +"NOLOG_INPUT","LOG_OUTPUT","NOLOG_OUTPUT","MAIL","NOMAIL","FOLLOW","NOFOLLOW", +"ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS","RUNASALIAS","ERROR","TYPE", +"ROLE","PRIVS","LIMITPRIVS","MYSELF","SHA224_TOK","SHA256_TOK","SHA384_TOK", +"SHA512_TOK", }; #if defined(__cplusplus) || defined(__STDC__) const char * const sudoersrule[] = @@ -637,6 +622,8 @@ char *sudoersrule[] = "cmndtag : cmndtag NOLOG_INPUT", "cmndtag : cmndtag LOG_OUTPUT", "cmndtag : cmndtag NOLOG_OUTPUT", +"cmndtag : cmndtag FOLLOW", +"cmndtag : cmndtag NOFOLLOW", "cmndtag : cmndtag MAIL", "cmndtag : cmndtag NOMAIL", "cmnd : ALL", @@ -701,7 +688,7 @@ short *yyss; short *yysslim; YYSTYPE *yyvs; unsigned int yystacksize; -#line 850 "gram.y" +#line 859 "gram.y" void sudoerserror(const char *s) { @@ -1000,7 +987,7 @@ init_parser(const char *path, bool quiet) debug_return_bool(rval); } -#line 951 "gram.c" +#line 938 "gram.c" /* allocate initial stack or double stack size, up to YYMAXDEPTH */ #if defined(__cplusplus) || defined(__STDC__) static int yygrowstack(void) @@ -1209,23 +1196,23 @@ yyreduce: switch (yyn) { case 1: -#line 165 "gram.y" +#line 167 "gram.y" { ; } break; case 5: -#line 173 "gram.y" +#line 175 "gram.y" { ; } break; case 6: -#line 176 "gram.y" +#line 178 "gram.y" { yyerrok; } break; case 7: -#line 179 "gram.y" +#line 181 "gram.y" { if (!add_userspec(yyvsp[-1].member, yyvsp[0].privilege)) { sudoerserror(N_("unable to allocate memory")); @@ -1234,31 +1221,31 @@ case 7: } break; case 8: -#line 185 "gram.y" +#line 187 "gram.y" { ; } break; case 9: -#line 188 "gram.y" +#line 190 "gram.y" { ; } break; case 10: -#line 191 "gram.y" +#line 193 "gram.y" { ; } break; case 11: -#line 194 "gram.y" +#line 196 "gram.y" { ; } break; case 12: -#line 197 "gram.y" +#line 199 "gram.y" { if (!add_defaults(DEFAULTS, NULL, yyvsp[0].defaults)) { sudoerserror(N_("unable to allocate memory")); @@ -1267,7 +1254,7 @@ case 12: } break; case 13: -#line 203 "gram.y" +#line 205 "gram.y" { if (!add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults)) { sudoerserror(N_("unable to allocate memory")); @@ -1276,7 +1263,7 @@ case 13: } break; case 14: -#line 209 "gram.y" +#line 211 "gram.y" { if (!add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults)) { sudoerserror(N_("unable to allocate memory")); @@ -1285,7 +1272,7 @@ case 14: } break; case 15: -#line 215 "gram.y" +#line 217 "gram.y" { if (!add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults)) { sudoerserror(N_("unable to allocate memory")); @@ -1294,7 +1281,7 @@ case 15: } break; case 16: -#line 221 "gram.y" +#line 223 "gram.y" { if (!add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults)) { sudoerserror(N_("unable to allocate memory")); @@ -1303,14 +1290,14 @@ case 16: } break; case 18: -#line 230 "gram.y" +#line 232 "gram.y" { HLTQ_CONCAT(yyvsp[-2].defaults, yyvsp[0].defaults, entries); yyval.defaults = yyvsp[-2].defaults; } break; case 19: -#line 236 "gram.y" +#line 238 "gram.y" { yyval.defaults = new_default(yyvsp[0].string, NULL, true); if (yyval.defaults == NULL) { @@ -1320,7 +1307,7 @@ case 19: } break; case 20: -#line 243 "gram.y" +#line 245 "gram.y" { yyval.defaults = new_default(yyvsp[0].string, NULL, false); if (yyval.defaults == NULL) { @@ -1330,7 +1317,7 @@ case 20: } break; case 21: -#line 250 "gram.y" +#line 252 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true); if (yyval.defaults == NULL) { @@ -1340,7 +1327,7 @@ case 21: } break; case 22: -#line 257 "gram.y" +#line 259 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+'); if (yyval.defaults == NULL) { @@ -1350,7 +1337,7 @@ case 22: } break; case 23: -#line 264 "gram.y" +#line 266 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-'); if (yyval.defaults == NULL) { @@ -1360,14 +1347,14 @@ case 23: } break; case 25: -#line 274 "gram.y" +#line 276 "gram.y" { HLTQ_CONCAT(yyvsp[-2].privilege, yyvsp[0].privilege, entries); yyval.privilege = yyvsp[-2].privilege; } break; case 26: -#line 280 "gram.y" +#line 282 "gram.y" { struct privilege *p = calloc(1, sizeof(*p)); if (p == NULL) { @@ -1381,21 +1368,21 @@ case 26: } break; case 27: -#line 293 "gram.y" +#line 295 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; case 28: -#line 297 "gram.y" +#line 299 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; case 29: -#line 303 "gram.y" +#line 305 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); if (yyval.member == NULL) { @@ -1405,7 +1392,7 @@ case 29: } break; case 30: -#line 310 "gram.y" +#line 312 "gram.y" { yyval.member = new_member(NULL, ALL); if (yyval.member == NULL) { @@ -1415,7 +1402,7 @@ case 30: } break; case 31: -#line 317 "gram.y" +#line 319 "gram.y" { yyval.member = new_member(yyvsp[0].string, NETGROUP); if (yyval.member == NULL) { @@ -1425,7 +1412,7 @@ case 31: } break; case 32: -#line 324 "gram.y" +#line 326 "gram.y" { yyval.member = new_member(yyvsp[0].string, NTWKADDR); if (yyval.member == NULL) { @@ -1435,7 +1422,7 @@ case 32: } break; case 33: -#line 331 "gram.y" +#line 333 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); if (yyval.member == NULL) { @@ -1445,7 +1432,7 @@ case 33: } break; case 35: -#line 341 "gram.y" +#line 343 "gram.y" { struct cmndspec *prev; prev = HLTQ_LAST(yyvsp[-2].cmndspec, cmndspec, entries); @@ -1478,6 +1465,8 @@ case 35: yyvsp[0].cmndspec->tags.log_output = prev->tags.log_output; if (yyvsp[0].cmndspec->tags.send_mail == UNSPEC) yyvsp[0].cmndspec->tags.send_mail = prev->tags.send_mail; + if (yyvsp[0].cmndspec->tags.follow == UNSPEC) + yyvsp[0].cmndspec->tags.follow = prev->tags.follow; if ((yyvsp[0].cmndspec->runasuserlist == NULL && yyvsp[0].cmndspec->runasgrouplist == NULL) && (prev->runasuserlist != NULL || @@ -1489,7 +1478,7 @@ case 35: } break; case 36: -#line 384 "gram.y" +#line 388 "gram.y" { struct cmndspec *cs = calloc(1, sizeof(*cs)); if (cs == NULL) { @@ -1538,7 +1527,7 @@ case 36: } break; case 37: -#line 432 "gram.y" +#line 436 "gram.y" { yyval.digest = new_digest(SUDO_DIGEST_SHA224, yyvsp[0].string); if (yyval.digest == NULL) { @@ -1548,7 +1537,7 @@ case 37: } break; case 38: -#line 439 "gram.y" +#line 443 "gram.y" { yyval.digest = new_digest(SUDO_DIGEST_SHA256, yyvsp[0].string); if (yyval.digest == NULL) { @@ -1558,7 +1547,7 @@ case 38: } break; case 39: -#line 446 "gram.y" +#line 450 "gram.y" { yyval.digest = new_digest(SUDO_DIGEST_SHA384, yyvsp[0].string); if (yyval.digest == NULL) { @@ -1568,7 +1557,7 @@ case 39: } break; case 40: -#line 453 "gram.y" +#line 457 "gram.y" { yyval.digest = new_digest(SUDO_DIGEST_SHA512, yyvsp[0].string); if (yyval.digest == NULL) { @@ -1578,13 +1567,13 @@ case 40: } break; case 41: -#line 462 "gram.y" +#line 466 "gram.y" { yyval.member = yyvsp[0].member; } break; case 42: -#line 465 "gram.y" +#line 469 "gram.y" { if (yyvsp[0].member->type != COMMAND) { sudoerserror(N_("a digest requires a path name")); @@ -1596,127 +1585,127 @@ case 42: } break; case 43: -#line 476 "gram.y" +#line 480 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; case 44: -#line 480 "gram.y" +#line 484 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; case 45: -#line 486 "gram.y" +#line 490 "gram.y" { yyval.string = yyvsp[0].string; } break; case 46: -#line 491 "gram.y" +#line 495 "gram.y" { yyval.string = yyvsp[0].string; } break; case 47: -#line 496 "gram.y" +#line 500 "gram.y" { yyval.seinfo.role = NULL; yyval.seinfo.type = NULL; } break; case 48: -#line 500 "gram.y" +#line 504 "gram.y" { yyval.seinfo.role = yyvsp[0].string; yyval.seinfo.type = NULL; } break; case 49: -#line 504 "gram.y" +#line 508 "gram.y" { yyval.seinfo.type = yyvsp[0].string; yyval.seinfo.role = NULL; } break; case 50: -#line 508 "gram.y" +#line 512 "gram.y" { yyval.seinfo.role = yyvsp[-1].string; yyval.seinfo.type = yyvsp[0].string; } break; case 51: -#line 512 "gram.y" +#line 516 "gram.y" { yyval.seinfo.type = yyvsp[-1].string; yyval.seinfo.role = yyvsp[0].string; } break; case 52: -#line 518 "gram.y" +#line 522 "gram.y" { yyval.string = yyvsp[0].string; } break; case 53: -#line 522 "gram.y" +#line 526 "gram.y" { yyval.string = yyvsp[0].string; } break; case 54: -#line 527 "gram.y" +#line 531 "gram.y" { yyval.privinfo.privs = NULL; yyval.privinfo.limitprivs = NULL; } break; case 55: -#line 531 "gram.y" +#line 535 "gram.y" { yyval.privinfo.privs = yyvsp[0].string; yyval.privinfo.limitprivs = NULL; } break; case 56: -#line 535 "gram.y" +#line 539 "gram.y" { yyval.privinfo.privs = NULL; yyval.privinfo.limitprivs = yyvsp[0].string; } break; case 57: -#line 539 "gram.y" +#line 543 "gram.y" { yyval.privinfo.privs = yyvsp[-1].string; yyval.privinfo.limitprivs = yyvsp[0].string; } break; case 58: -#line 543 "gram.y" +#line 547 "gram.y" { yyval.privinfo.limitprivs = yyvsp[-1].string; yyval.privinfo.privs = yyvsp[0].string; } break; case 59: -#line 549 "gram.y" +#line 553 "gram.y" { yyval.runas = NULL; } break; case 60: -#line 552 "gram.y" +#line 556 "gram.y" { yyval.runas = yyvsp[-1].runas; } break; case 61: -#line 557 "gram.y" +#line 561 "gram.y" { yyval.runas = calloc(1, sizeof(struct runascontainer)); if (yyval.runas != NULL) { @@ -1734,7 +1723,7 @@ case 61: } break; case 62: -#line 572 "gram.y" +#line 576 "gram.y" { yyval.runas = calloc(1, sizeof(struct runascontainer)); if (yyval.runas == NULL) { @@ -1746,7 +1735,7 @@ case 62: } break; case 63: -#line 581 "gram.y" +#line 585 "gram.y" { yyval.runas = calloc(1, sizeof(struct runascontainer)); if (yyval.runas == NULL) { @@ -1758,7 +1747,7 @@ case 63: } break; case 64: -#line 590 "gram.y" +#line 594 "gram.y" { yyval.runas = calloc(1, sizeof(struct runascontainer)); if (yyval.runas == NULL) { @@ -1770,7 +1759,7 @@ case 64: } break; case 65: -#line 599 "gram.y" +#line 603 "gram.y" { yyval.runas = calloc(1, sizeof(struct runascontainer)); if (yyval.runas != NULL) { @@ -1788,86 +1777,97 @@ case 65: } break; case 66: -#line 616 "gram.y" +#line 620 "gram.y" { - yyval.tag.log_input = yyval.tag.log_output = yyval.tag.noexec = - yyval.tag.nopasswd = yyval.tag.send_mail = yyval.tag.setenv = UNSPEC; + TAGS_INIT(yyval.tag); } break; case 67: -#line 620 "gram.y" +#line 623 "gram.y" { yyval.tag.nopasswd = true; } break; case 68: -#line 623 "gram.y" +#line 626 "gram.y" { yyval.tag.nopasswd = false; } break; case 69: -#line 626 "gram.y" +#line 629 "gram.y" { yyval.tag.noexec = true; } break; case 70: -#line 629 "gram.y" +#line 632 "gram.y" { yyval.tag.noexec = false; } break; case 71: -#line 632 "gram.y" +#line 635 "gram.y" { yyval.tag.setenv = true; } break; case 72: -#line 635 "gram.y" +#line 638 "gram.y" { yyval.tag.setenv = false; } break; case 73: -#line 638 "gram.y" +#line 641 "gram.y" { yyval.tag.log_input = true; } break; case 74: -#line 641 "gram.y" +#line 644 "gram.y" { yyval.tag.log_input = false; } break; case 75: -#line 644 "gram.y" +#line 647 "gram.y" { yyval.tag.log_output = true; } break; case 76: -#line 647 "gram.y" +#line 650 "gram.y" { yyval.tag.log_output = false; } break; case 77: -#line 650 "gram.y" +#line 653 "gram.y" { - yyval.tag.send_mail = true; + yyval.tag.follow = true; } break; case 78: -#line 653 "gram.y" +#line 656 "gram.y" { - yyval.tag.send_mail = false; + yyval.tag.follow = false; } break; case 79: -#line 658 "gram.y" +#line 659 "gram.y" +{ + yyval.tag.send_mail = true; + } +break; +case 80: +#line 662 "gram.y" +{ + yyval.tag.send_mail = false; + } +break; +case 81: +#line 667 "gram.y" { yyval.member = new_member(NULL, ALL); if (yyval.member == NULL) { @@ -1876,8 +1876,8 @@ case 79: } } break; -case 80: -#line 665 "gram.y" +case 82: +#line 674 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); if (yyval.member == NULL) { @@ -1886,8 +1886,8 @@ case 80: } } break; -case 81: -#line 672 "gram.y" +case 83: +#line 681 "gram.y" { struct sudo_command *c = calloc(1, sizeof(*c)); if (c == NULL) { @@ -1904,8 +1904,8 @@ case 81: } } break; -case 84: -#line 693 "gram.y" +case 86: +#line 702 "gram.y" { const char *s; if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) { @@ -1914,15 +1914,15 @@ case 84: } } break; -case 86: -#line 703 "gram.y" +case 88: +#line 712 "gram.y" { HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); yyval.member = yyvsp[-2].member; } break; -case 89: -#line 713 "gram.y" +case 91: +#line 722 "gram.y" { const char *s; if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) { @@ -1931,15 +1931,15 @@ case 89: } } break; -case 91: -#line 723 "gram.y" +case 93: +#line 732 "gram.y" { HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); yyval.member = yyvsp[-2].member; } break; -case 94: -#line 733 "gram.y" +case 96: +#line 742 "gram.y" { const char *s; if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) { @@ -1948,8 +1948,8 @@ case 94: } } break; -case 97: -#line 746 "gram.y" +case 99: +#line 755 "gram.y" { const char *s; if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) { @@ -1958,29 +1958,29 @@ case 97: } } break; -case 99: -#line 756 "gram.y" +case 101: +#line 765 "gram.y" { HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); yyval.member = yyvsp[-2].member; } break; -case 100: -#line 762 "gram.y" +case 102: +#line 771 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; -case 101: -#line 766 "gram.y" +case 103: +#line 775 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; -case 102: -#line 772 "gram.y" +case 104: +#line 781 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); if (yyval.member == NULL) { @@ -1989,8 +1989,8 @@ case 102: } } break; -case 103: -#line 779 "gram.y" +case 105: +#line 788 "gram.y" { yyval.member = new_member(NULL, ALL); if (yyval.member == NULL) { @@ -1999,8 +1999,8 @@ case 103: } } break; -case 104: -#line 786 "gram.y" +case 106: +#line 795 "gram.y" { yyval.member = new_member(yyvsp[0].string, NETGROUP); if (yyval.member == NULL) { @@ -2009,8 +2009,8 @@ case 104: } } break; -case 105: -#line 793 "gram.y" +case 107: +#line 802 "gram.y" { yyval.member = new_member(yyvsp[0].string, USERGROUP); if (yyval.member == NULL) { @@ -2019,8 +2019,8 @@ case 105: } } break; -case 106: -#line 800 "gram.y" +case 108: +#line 809 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); if (yyval.member == NULL) { @@ -2029,29 +2029,29 @@ case 106: } } break; -case 108: -#line 810 "gram.y" +case 110: +#line 819 "gram.y" { HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); yyval.member = yyvsp[-2].member; } break; -case 109: -#line 816 "gram.y" +case 111: +#line 825 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; -case 110: -#line 820 "gram.y" +case 112: +#line 829 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; -case 111: -#line 826 "gram.y" +case 113: +#line 835 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); if (yyval.member == NULL) { @@ -2060,8 +2060,8 @@ case 111: } } break; -case 112: -#line 833 "gram.y" +case 114: +#line 842 "gram.y" { yyval.member = new_member(NULL, ALL); if (yyval.member == NULL) { @@ -2070,8 +2070,8 @@ case 112: } } break; -case 113: -#line 840 "gram.y" +case 115: +#line 849 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); if (yyval.member == NULL) { diff --git a/plugins/sudoers/gram.h b/plugins/sudoers/gram.h index 8ad05fb59..c0a8e45c3 100644 --- a/plugins/sudoers/gram.h +++ b/plugins/sudoers/gram.h @@ -23,22 +23,24 @@ #define NOLOG_OUTPUT 279 #define MAIL 280 #define NOMAIL 281 -#define ALL 282 -#define COMMENT 283 -#define HOSTALIAS 284 -#define CMNDALIAS 285 -#define USERALIAS 286 -#define RUNASALIAS 287 -#define ERROR 288 -#define TYPE 289 -#define ROLE 290 -#define PRIVS 291 -#define LIMITPRIVS 292 -#define MYSELF 293 -#define SHA224_TOK 294 -#define SHA256_TOK 295 -#define SHA384_TOK 296 -#define SHA512_TOK 297 +#define FOLLOW 282 +#define NOFOLLOW 283 +#define ALL 284 +#define COMMENT 285 +#define HOSTALIAS 286 +#define CMNDALIAS 287 +#define USERALIAS 288 +#define RUNASALIAS 289 +#define ERROR 290 +#define TYPE 291 +#define ROLE 292 +#define PRIVS 293 +#define LIMITPRIVS 294 +#define MYSELF 295 +#define SHA224_TOK 296 +#define SHA256_TOK 297 +#define SHA384_TOK 298 +#define SHA512_TOK 299 #ifndef YYSTYPE_DEFINED #define YYSTYPE_DEFINED typedef union { diff --git a/plugins/sudoers/gram.y b/plugins/sudoers/gram.y index 82604ba82..8e3d95eca 100644 --- a/plugins/sudoers/gram.y +++ b/plugins/sudoers/gram.y @@ -111,6 +111,8 @@ static struct sudo_digest *new_digest(int, const char *); %token NOLOG_OUTPUT /* don't log cmnd output */ %token MAIL /* mail log message */ %token NOMAIL /* don't mail log message */ +%token FOLLOW /* follow symbolic links */ +%token NOFOLLOW /* don't follow symbolic links */ %token ALL /* ALL keyword */ %token COMMENT /* comment and/or carriage return */ %token HOSTALIAS /* Host_Alias keyword */ @@ -370,6 +372,8 @@ cmndspeclist : cmndspec $3->tags.log_output = prev->tags.log_output; if ($3->tags.send_mail == UNSPEC) $3->tags.send_mail = prev->tags.send_mail; + if ($3->tags.follow == UNSPEC) + $3->tags.follow = prev->tags.follow; if (($3->runasuserlist == NULL && $3->runasgrouplist == NULL) && (prev->runasuserlist != NULL || @@ -614,8 +618,7 @@ runaslist : /* empty */ { ; cmndtag : /* empty */ { - $$.log_input = $$.log_output = $$.noexec = - $$.nopasswd = $$.send_mail = $$.setenv = UNSPEC; + TAGS_INIT($$); } | cmndtag NOPASSWD { $$.nopasswd = true; @@ -647,6 +650,12 @@ cmndtag : /* empty */ { | cmndtag NOLOG_OUTPUT { $$.log_output = false; } + | cmndtag FOLLOW { + $$.follow = true; + } + | cmndtag NOFOLLOW { + $$.follow = false; + } | cmndtag MAIL { $$.send_mail = true; } diff --git a/plugins/sudoers/ldap.c b/plugins/sudoers/ldap.c index e4c451f97..751044ed1 100644 --- a/plugins/sudoers/ldap.c +++ b/plugins/sudoers/ldap.c @@ -2325,6 +2325,9 @@ sudo_ldap_display_entry_short(LDAP *ld, LDAPMessage *entry, struct sudo_lbuf *lb if (strcmp(cp, "authenticate") == 0) sudo_lbuf_append(lbuf, (*p)->bv_val[0] == '!' ? "NOPASSWD: " : "PASSWD: "); + else if (strcmp(cp, "sudoedit_follow") == 0) + sudo_lbuf_append(lbuf, (*p)->bv_val[0] == '!' ? + "FOLLOW: " : "NOFOLLOW: "); else if (strcmp(cp, "noexec") == 0) sudo_lbuf_append(lbuf, (*p)->bv_val[0] == '!' ? "EXEC: " : "NOEXEC: "); diff --git a/plugins/sudoers/parse.c b/plugins/sudoers/parse.c index 793bbcf4a..b8f04b162 100644 --- a/plugins/sudoers/parse.c +++ b/plugins/sudoers/parse.c @@ -320,6 +320,8 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag) def_mail_no_perms = false; } } + if (tags->follow != UNSPEC) + def_sudoedit_follow = tags->follow; } } else if (match == DENY) { SET(validated, VALIDATE_FAILURE); @@ -346,9 +348,6 @@ done: debug_return_int(validated); } -#define TAG_SET(tt) \ - ((tt) != UNSPEC && (tt) != IMPLIED) - #define TAG_CHANGED(t) \ (TAG_SET(cs->tags.t) && cs->tags.t != tags->t) @@ -394,14 +393,14 @@ sudo_file_append_cmnd(struct cmndspec *cs, struct cmndtag *tags, tags->send_mail = cs->tags.send_mail; sudo_lbuf_append(lbuf, tags->send_mail ? "MAIL: " : "NOMAIL: "); } + if (TAG_CHANGED(follow)) { + tags->follow = cs->tags.follow; + sudo_lbuf_append(lbuf, tags->follow ? "FOLLOW: " : "NOFOLLOW: "); + } print_member(lbuf, cs->cmnd, CMNDALIAS); debug_return_bool(!sudo_lbuf_error(lbuf)); } -#define RUNAS_CHANGED(cs1, cs2) \ - (cs1->runasuserlist != cs2->runasuserlist || \ - cs1->runasgrouplist != cs2->runasgrouplist) - static int sudo_file_display_priv_short(struct passwd *pw, struct userspec *us, struct sudo_lbuf *lbuf) @@ -414,12 +413,7 @@ sudo_file_display_priv_short(struct passwd *pw, struct userspec *us, debug_decl(sudo_file_display_priv_short, SUDOERS_DEBUG_NSS) /* gcc -Wuninitialized false positive */ - tags.log_input = UNSPEC; - tags.log_output = UNSPEC; - tags.noexec = UNSPEC; - tags.nopasswd = UNSPEC; - tags.send_mail = UNSPEC; - tags.setenv = UNSPEC; + TAGS_INIT(tags); TAILQ_FOREACH(priv, &us->privileges, entries) { if (hostlist_matches(&priv->hostlist) != ALLOW) continue; @@ -449,12 +443,7 @@ sudo_file_display_priv_short(struct passwd *pw, struct userspec *us, } } sudo_lbuf_append(lbuf, ") "); - tags.log_input = UNSPEC; - tags.log_output = UNSPEC; - tags.noexec = UNSPEC; - tags.nopasswd = UNSPEC; - tags.send_mail = UNSPEC; - tags.setenv = UNSPEC; + TAGS_INIT(tags); } else if (cs != TAILQ_FIRST(&priv->cmndlist)) { sudo_lbuf_append(lbuf, ", "); } @@ -467,13 +456,6 @@ sudo_file_display_priv_short(struct passwd *pw, struct userspec *us, debug_return_int(nfound); } -#define TAGS_CHANGED(ot, nt) \ - ((TAG_SET((nt).setenv) && (nt).setenv != (ot).setenv) || \ - (TAG_SET((nt).noexec) && (nt).noexec != (ot).noexec) || \ - (TAG_SET((nt).nopasswd) && (nt).nopasswd != (ot).nopasswd) || \ - (TAG_SET((nt).log_input) && (nt).log_input != (ot).log_input) || \ - (TAG_SET((nt).log_output) && (nt).log_output != (ot).log_output)) - /* * Compare the current cmndspec with the previous one to determine * whether we need to start a new long entry for "sudo -ll". diff --git a/plugins/sudoers/parse.h b/plugins/sudoers/parse.h index e51d2326b..85e02297a 100644 --- a/plugins/sudoers/parse.h +++ b/plugins/sudoers/parse.h @@ -27,6 +27,54 @@ #undef IMPLIED #define IMPLIED 2 +/* + * Initialize all tags to UNSPEC. + */ +#define TAGS_INIT(t) do { \ + (t).follow = UNSPEC; \ + (t).log_input = UNSPEC; \ + (t).log_output = UNSPEC; \ + (t).noexec = UNSPEC; \ + (t).nopasswd = UNSPEC; \ + (t).send_mail = UNSPEC; \ + (t).setenv = UNSPEC; \ +} while (0) + +/* + * Returns true if any tag are not UNSPEC, else false. + */ +#define TAGS_SET(t) \ + ((t).follow != UNSPEC || (t).log_input != UNSPEC || \ + (t).log_output != UNSPEC || (t).noexec != UNSPEC || \ + (t).nopasswd != UNSPEC || (t).send_mail != UNSPEC || \ + (t).setenv != UNSPEC) + +/* + * Returns true if the specified tag is not UNSPEC or IMPLIED, else false. + */ +#define TAG_SET(tt) \ + ((tt) != UNSPEC && (tt) != IMPLIED) + +/* + * Returns true if any tags set in nt differ between ot and nt, else false. + */ +#define TAGS_CHANGED(ot, nt) \ + ((TAG_SET((nt).follow) && (nt).follow != (ot).follow) || \ + (TAG_SET((nt).log_input) && (nt).log_input != (ot).log_input) || \ + (TAG_SET((nt).log_output) && (nt).log_output != (ot).log_output) || \ + (TAG_SET((nt).noexec) && (nt).noexec != (ot).noexec) || \ + (TAG_SET((nt).nopasswd) && (nt).nopasswd != (ot).nopasswd) || \ + (TAG_SET((nt).setenv) && (nt).setenv != (ot).setenv) || \ + (TAG_SET((nt).send_mail) && (nt).send_mail != (ot).send_mail)) + +/* + * Returns true if the runas user and group lists match, else false. + */ +#define RUNAS_CHANGED(cs1, cs2) \ + ((cs1) == NULL || (cs2) == NULL || \ + (cs1)->runasuserlist != (cs2)->runasuserlist || \ + (cs1)->runasgrouplist != (cs2)->runasgrouplist) + #define SUDO_DIGEST_SHA224 0 #define SUDO_DIGEST_SHA256 1 #define SUDO_DIGEST_SHA384 2 @@ -59,6 +107,7 @@ struct cmndtag { signed int log_input: 3; signed int log_output: 3; signed int send_mail: 3; + signed int follow: 3; }; /* diff --git a/plugins/sudoers/policy.c b/plugins/sudoers/policy.c index 59fc1fa03..a92b7a7a9 100644 --- a/plugins/sudoers/policy.c +++ b/plugins/sudoers/policy.c @@ -438,6 +438,10 @@ sudoers_policy_exec_setup(char *argv[], char *envp[], mode_t cmnd_umask, if (ISSET(sudo_mode, MODE_EDIT)) { if ((command_info[info_len++] = strdup("sudoedit=true")) == NULL) goto oom; + if (def_sudoedit_follow) { + if ((command_info[info_len++] = strdup("sudoedit_follow=true")) == NULL) + goto oom; + } } if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) { /* Set cwd to run user's homedir. */ diff --git a/plugins/sudoers/regress/sudoers/test1.in b/plugins/sudoers/regress/sudoers/test1.in index 455456abd..70e8a0358 100644 --- a/plugins/sudoers/regress/sudoers/test1.in +++ b/plugins/sudoers/regress/sudoers/test1.in @@ -8,3 +8,5 @@ user2 ALL = NOPASSWD: NOEXEC: SETENV: /usr/bin/vi:\ ALL = PASSWD: EXEC: NOSETENV: /usr/bin/echo user3 ALL = MAIL: /bin/sh:\ ALL = NOMAIL: /usr/bin/id +user4 ALL = FOLLOW: sudoedit /etc/motd:\ + ALL = NOFOLLOW: sudoedit /home/*/* diff --git a/plugins/sudoers/regress/sudoers/test1.json.ok b/plugins/sudoers/regress/sudoers/test1.json.ok index 214f40edb..58875dcee 100644 --- a/plugins/sudoers/regress/sudoers/test1.json.ok +++ b/plugins/sudoers/regress/sudoers/test1.json.ok @@ -113,6 +113,42 @@ ] } ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostalias": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "sudoedit_follow": true } + ], + "Commands": [ + { "command": "sudoedit \/etc\/motd" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostalias": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "sudoedit_follow": false } + ], + "Commands": [ + { "command": "sudoedit \/home\/*\/*" } + ] + } + ] } ] } diff --git a/plugins/sudoers/regress/sudoers/test1.out.ok b/plugins/sudoers/regress/sudoers/test1.out.ok index a68124ea6..34f9aa2ba 100644 --- a/plugins/sudoers/regress/sudoers/test1.out.ok +++ b/plugins/sudoers/regress/sudoers/test1.out.ok @@ -5,3 +5,4 @@ Parses OK. user1 ALL = LOG_INPUT: LOG_OUTPUT: /usr/bin/su - : ALL = NOLOG_INPUT: NOLOG_OUTPUT: /usr/bin/id user2 ALL = NOEXEC: NOPASSWD: SETENV: /usr/bin/vi : ALL = EXEC: PASSWD: NOSETENV: /usr/bin/echo user3 ALL = MAIL: /bin/sh : ALL = NOMAIL: /usr/bin/id +user4 ALL = FOLLOW: sudoedit /etc/motd : ALL = NOFOLLOW: sudoedit /home/*/* diff --git a/plugins/sudoers/regress/sudoers/test1.toke.ok b/plugins/sudoers/regress/sudoers/test1.toke.ok index a9c18bb91..79945dc9e 100644 --- a/plugins/sudoers/regress/sudoers/test1.toke.ok +++ b/plugins/sudoers/regress/sudoers/test1.toke.ok @@ -5,3 +5,4 @@ WORD(5) ALL = LOG_INPUT LOG_OUTPUT COMMAND ARG : ALL = NOLOG_INPUT NOLOG_OUTPUT COMMAND WORD(5) ALL = NOPASSWD NOEXEC SETENV COMMAND : ALL = PASSWD EXEC NOSETENV COMMAND WORD(5) ALL = MAIL COMMAND : ALL = NOMAIL COMMAND +WORD(5) ALL = FOLLOW COMMAND ARG : ALL = NOFOLLOW COMMAND ARG diff --git a/plugins/sudoers/sudoers_version.h b/plugins/sudoers/sudoers_version.h index 57fe1df20..ce9539416 100644 --- a/plugins/sudoers/sudoers_version.h +++ b/plugins/sudoers/sudoers_version.h @@ -63,11 +63,12 @@ * 42 sudo 1.8.6, Support for empty Runas_List (with or without a colon) to mean the invoking user. Support for Solaris Privilege Sets (PRIVS= and LIMITPRIVS=). * 43 sudo 1.8.7, Support for specifying a digest along with the command. * 44 sudo 1.8.13, added MAIL/NOMAIL tags. + * 45 sudo 1.8.15, added FOLLOW/NOFOLLOW tags and sudoedit_follow Default. */ #ifndef SUDOERS_VERSION_H #define SUDOERS_VERSION_H -#define SUDOERS_GRAMMAR_VERSION 44 +#define SUDOERS_GRAMMAR_VERSION 45 #endif /* SUDOERS_VERSION_H */ diff --git a/plugins/sudoers/testsudoers.c b/plugins/sudoers/testsudoers.c index 13fade718..1feee9a4a 100644 --- a/plugins/sudoers/testsudoers.c +++ b/plugins/sudoers/testsudoers.c @@ -591,12 +591,7 @@ print_privilege(struct privilege *priv) print_member(m); } fputs(" = ", stdout); - tags.log_input = UNSPEC; - tags.log_output = UNSPEC; - tags.noexec = UNSPEC; - tags.nopasswd = UNSPEC; - tags.send_mail = UNSPEC; - tags.setenv = UNSPEC; + TAGS_INIT(tags); TAILQ_FOREACH(cs, &priv->cmndlist, entries) { if (cs != TAILQ_FIRST(&priv->cmndlist)) fputs(", ", stdout); @@ -635,6 +630,8 @@ print_privilege(struct privilege *priv) if (cs->limitprivs) printf("LIMITPRIVS=%s ", cs->limitprivs); #endif /* HAVE_PRIV_SET */ + if (TAG_CHANGED(follow)) + printf("%sFOLLOW: ", cs->tags.follow ? "" : "NO"); if (TAG_CHANGED(log_input)) printf("%sLOG_INPUT: ", cs->tags.log_input ? "" : "NO"); if (TAG_CHANGED(log_output)) diff --git a/plugins/sudoers/toke.c b/plugins/sudoers/toke.c index 537aa21d4..9a1acc864 100644 --- a/plugins/sudoers/toke.c +++ b/plugins/sudoers/toke.c @@ -306,102 +306,105 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 69 -#define YY_END_OF_BUFFER 70 -static yyconst short int yy_accept[834] = +#define YY_NUM_RULES 71 +#define YY_END_OF_BUFFER 72 +static yyconst short int yy_accept[862] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 70, 57, 65, 64, 63, 56, - 67, 36, 58, 59, 36, 60, 57, 57, 57, 57, - 62, 61, 68, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 68, 57, 57, 65, 67, 48, - 48, 48, 48, 48, 2, 68, 1, 57, 48, 48, - 57, 17, 16, 17, 16, 16, 68, 67, 68, 3, - 9, 8, 9, 4, 9, 5, 68, 13, 13, 13, - 11, 12, 68, 19, 19, 18, 18, 18, 19, 18, - 18, 18, 19, 19, 19, 19, 19, 19, 18, 19, - - 19, 57, 0, 65, 63, 67, 67, 0, 57, 38, - 0, 36, 0, 37, 0, 55, 55, 0, 57, 57, - 0, 57, 57, 57, 57, 0, 41, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 57, 66, 57, 57, 65, 0, 0, 0, 0, 0, - 67, 57, 57, 57, 57, 57, 2, 1, 0, 1, - 49, 49, 0, 57, 17, 17, 15, 14, 15, 0, - 0, 3, 9, 0, 6, 7, 9, 9, 13, 0, - 13, 13, 0, 10, 38, 0, 0, 37, 19, 19, - 0, 19, 0, 0, 18, 18, 18, 18, 18, 18, - - 19, 19, 48, 19, 19, 19, 19, 19, 19, 19, - 19, 67, 67, 0, 38, 57, 57, 57, 57, 57, - 0, 0, 41, 41, 48, 43, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 57, 57, 0, 0, 0, 0, 0, 67, 57, 57, - 57, 57, 57, 0, 57, 10, 0, 0, 0, 18, - 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 67, 57, 57, 57, 57, - 57, 57, 0, 42, 42, 42, 0, 0, 41, 41, - 41, 41, 41, 41, 41, 48, 48, 48, 48, 48, - - 48, 48, 48, 48, 48, 48, 48, 44, 48, 45, - 57, 57, 57, 57, 0, 0, 0, 0, 0, 67, - 57, 57, 57, 57, 0, 0, 0, 0, 0, 18, - 18, 19, 48, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 57, 57, 57, 0, 0, - 42, 42, 42, 0, 41, 41, 0, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 0, 27, - 48, 48, 48, 0, 34, 48, 48, 48, 48, 48, - 48, 46, 48, 57, 57, 57, 57, 57, 0, 0, - 0, 67, 57, 57, 57, 0, 0, 0, 18, 18, - - 48, 48, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 57, 57, 57, 57, 57, 0, - 42, 0, 41, 41, 41, 0, 0, 0, 41, 41, + 0, 0, 0, 0, 72, 59, 67, 66, 65, 58, + 69, 38, 60, 61, 38, 62, 59, 59, 59, 59, + 64, 63, 70, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 70, 59, 59, 67, 69, + 50, 50, 50, 50, 50, 2, 70, 1, 59, 50, + 50, 59, 17, 16, 17, 16, 16, 70, 69, 70, + 3, 9, 8, 9, 4, 9, 5, 70, 13, 13, + 13, 11, 12, 70, 19, 19, 18, 18, 18, 19, + 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, + + 18, 19, 19, 59, 0, 67, 65, 69, 69, 0, + 59, 40, 0, 38, 0, 39, 0, 57, 57, 0, + 59, 59, 0, 59, 59, 59, 59, 0, 43, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 59, 68, 59, 59, 67, 0, 0, + 0, 0, 0, 69, 59, 59, 59, 59, 59, 2, + 1, 0, 1, 51, 51, 0, 59, 17, 17, 15, + 14, 15, 0, 0, 3, 9, 0, 6, 7, 9, + 9, 13, 0, 13, 13, 0, 10, 40, 0, 0, + 39, 19, 19, 0, 19, 0, 0, 18, 18, 18, + + 18, 18, 18, 19, 19, 50, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 69, 69, 0, 40, 59, + 59, 59, 59, 59, 0, 0, 43, 43, 50, 45, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 59, 59, 0, 0, + 0, 0, 0, 69, 59, 59, 59, 59, 59, 0, + 59, 10, 0, 0, 0, 18, 18, 18, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 69, 59, 59, 59, 59, 59, 59, + 0, 44, 44, 44, 0, 0, 43, 43, 43, 43, + + 43, 43, 43, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 46, 50, 47, + 59, 59, 59, 59, 0, 0, 0, 0, 0, 69, + 59, 59, 59, 59, 0, 0, 0, 0, 0, 18, + 18, 19, 19, 50, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 59, 59, 59, + 0, 0, 44, 44, 44, 0, 43, 43, 0, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 0, 27, 50, 50, 50, 50, 0, 34, 50, 50, + 50, 50, 50, 50, 50, 48, 50, 59, 59, 59, + + 59, 59, 0, 0, 0, 69, 59, 59, 59, 0, + 0, 0, 18, 18, 19, 50, 50, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 59, 59, 59, 59, 59, 0, 44, 0, 43, 43, + 43, 0, 0, 0, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 52, + 53, 54, 55, 59, 0, 0, 69, 59, 59, 59, + 0, 0, 0, 0, 0, 19, 50, 50, 19, 19, + 50, 19, 19, 19, 19, 19, 19, 19, 19, 19, + + 19, 41, 41, 41, 0, 0, 43, 43, 43, 43, + 43, 43, 43, 0, 0, 0, 0, 0, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 0, 36, 50, 50, 50, 0, 26, 50, + 50, 50, 0, 35, 50, 50, 0, 25, 0, 28, + 59, 0, 0, 69, 59, 59, 59, 41, 41, 41, + 50, 50, 19, 50, 50, 19, 19, 19, 59, 41, + 41, 41, 41, 0, 43, 0, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + + 43, 43, 43, 50, 50, 50, 50, 50, 50, 50, + 50, 56, 0, 0, 69, 59, 22, 51, 0, 41, + 41, 41, 41, 50, 50, 19, 50, 50, 19, 19, + 19, 42, 42, 42, 42, 43, 0, 0, 0, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 0, 0, 0, 0, 0, 43, 43, 43, + 43, 43, 43, 43, 43, 50, 50, 50, 0, 37, + 50, 50, 0, 24, 0, 29, 0, 22, 69, 69, + 59, 0, 59, 42, 42, 42, 42, 50, 50, 50, + 50, 59, 59, 42, 42, 42, 42, 0, 0, 0, + + 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 49, 0, 32, 50, 50, 50, 0, 69, + 69, 20, 69, 23, 22, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 42, 42, 42, 42, 50, 50, + 50, 59, 59, 59, 0, 0, 0, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 0, 30, 50, 50, 23, + 69, 0, 22, 0, 0, 0, 50, 50, 59, 59, + 59, 59, 59, 0, 0, 0, 0, 0, 43, 43, + + 43, 43, 43, 43, 43, 43, 0, 33, 50, 69, + 0, 0, 0, 0, 0, 50, 59, 59, 59, 43, + 43, 43, 43, 43, 43, 0, 31, 69, 69, 21, + 0, 0, 0, 59, 59, 59, 59, 59, 43, 43, + 43, 43, 43, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 50, 51, 52, 53, 57, 0, 0, 67, 57, - 57, 57, 0, 0, 0, 0, 0, 48, 48, 19, - 48, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 39, 39, 39, 0, 0, 41, 41, 41, 41, - 41, 41, 41, 0, 0, 0, 0, 0, 41, 41, - - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 48, 48, 48, 0, 26, 48, 48, 0, - 35, 48, 48, 0, 25, 0, 28, 57, 0, 0, - 67, 57, 57, 57, 39, 39, 39, 48, 48, 48, - 48, 19, 19, 19, 57, 39, 39, 39, 39, 0, - 41, 0, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 0, 0, 0, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 48, - 48, 48, 48, 48, 48, 48, 54, 0, 0, 67, - 57, 22, 49, 0, 39, 39, 39, 39, 48, 48, - - 48, 48, 19, 19, 19, 40, 40, 40, 40, 41, - 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, - 0, 41, 41, 41, 41, 41, 41, 41, 41, 48, - 48, 48, 48, 48, 0, 24, 0, 29, 0, 22, - 67, 67, 57, 0, 57, 40, 40, 40, 40, 48, - 48, 48, 48, 57, 57, 40, 40, 40, 40, 0, - 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 47, 0, 32, 48, 48, 48, - - 0, 67, 67, 20, 67, 23, 22, 0, 0, 0, - 0, 0, 22, 0, 0, 0, 40, 40, 40, 40, - 48, 48, 48, 57, 57, 57, 0, 0, 0, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 0, 30, 48, - 48, 23, 67, 0, 22, 0, 0, 0, 48, 48, - 57, 57, 57, 57, 57, 0, 0, 0, 0, 0, - 41, 41, 41, 41, 41, 41, 41, 41, 0, 33, - 48, 67, 0, 0, 0, 0, 0, 48, 57, 57, - 57, 41, 41, 41, 41, 41, 41, 0, 31, 67, - - 67, 21, 0, 0, 0, 57, 57, 57, 57, 57, - 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, - 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 0 + 0 } ; static yyconst int yy_ec[256] = @@ -412,14 +415,14 @@ static yyconst int yy_ec[256] = 1, 2, 4, 5, 6, 1, 7, 1, 1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 1, 1, - 27, 28, 10, 29, 30, 31, 32, 33, 34, 31, - 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, - 38, 44, 45, 46, 47, 48, 49, 50, 51, 38, - 10, 52, 10, 1, 53, 1, 54, 55, 56, 57, - - 58, 59, 60, 61, 62, 60, 60, 63, 64, 65, - 66, 60, 60, 67, 68, 69, 70, 60, 60, 60, - 60, 60, 1, 1, 1, 1, 1, 1, 1, 1, + 27, 28, 10, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 39, 40, 41, 42, 43, 44, + 39, 45, 46, 47, 48, 49, 50, 51, 52, 39, + 10, 53, 10, 1, 54, 1, 55, 56, 57, 58, + + 59, 60, 61, 62, 63, 61, 61, 64, 65, 66, + 67, 61, 61, 68, 69, 70, 71, 61, 61, 61, + 61, 61, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -436,862 +439,867 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[71] = +static yyconst int yy_meta[72] = { 0, 1, 2, 3, 4, 5, 6, 1, 7, 7, 1, 8, 9, 10, 11, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 15, 7, 1, 16, - 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, + 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 18, 19, 20, 20, 20, 20, 20, 20, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21 + 17, 17, 18, 19, 20, 20, 20, 20, 20, 20, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21 } ; -static yyconst short int yy_base[951] = +static yyconst short int yy_base[979] = { 0, - 0, 69, 71, 79, 94, 124, 175, 244, 153, 197, - 85, 130, 314, 0, 4617, 4563, 4604, 5604, 4601, 5604, - 382, 86, 5604, 5604, 4548, 5604, 140, 394, 195, 153, - 4571, 5604, 5604, 453, 4555, 43, 508, 37, 4563, 4543, - 65, 4542, 4545, 4526, 566, 581, 91, 151, 604, 39, - 41, 4510, 34, 4507, 117, 4561, 4571, 428, 4530, 4534, - 136, 0, 5604, 4554, 5604, 0, 606, 664, 105, 0, - 4504, 5604, 115, 5604, 133, 5604, 138, 4502, 152, 171, - 5604, 188, 383, 641, 694, 737, 235, 245, 794, 843, - 4514, 157, 898, 4510, 4521, 4480, 4491, 4482, 944, 0, - - 206, 4462, 266, 4511, 4508, 4508, 5604, 263, 532, 585, - 4497, 608, 707, 4457, 829, 648, 4370, 968, 981, 1018, - 4395, 4406, 563, 708, 422, 4393, 371, 1062, 1106, 4379, - 4383, 4376, 4380, 4377, 596, 4368, 4375, 4372, 4364, 4366, - 644, 5604, 237, 137, 946, 4344, 4349, 4340, 4335, 4336, - 121, 225, 530, 377, 369, 335, 445, 4401, 720, 4400, - 931, 4349, 1018, 169, 0, 4396, 160, 5604, 5604, 991, - 388, 0, 4347, 638, 5604, 5604, 4346, 661, 4345, 4380, - 392, 221, 420, 4382, 653, 665, 1139, 4331, 1145, 0, - 1173, 1201, 1210, 1037, 1239, 4368, 1081, 1170, 826, 1288, - - 1343, 4342, 0, 4346, 4344, 4341, 904, 4332, 4330, 4321, - 4317, 4370, 4369, 1222, 1258, 1389, 1362, 968, 1428, 4357, - 4344, 1472, 520, 1517, 1561, 1605, 4337, 4331, 4314, 4327, - 4315, 4322, 4333, 4332, 4327, 4315, 4300, 4313, 4312, 4311, - 654, 493, 4279, 4284, 4274, 4276, 4282, 534, 617, 4285, - 491, 407, 506, 1413, 579, 4336, 4323, 4322, 1651, 1661, - 4321, 1705, 0, 4302, 4280, 4272, 4260, 4267, 4278, 4277, - 4272, 4220, 4219, 811, 4175, 4226, 1749, 378, 0, 0, - 1041, 243, 4191, 4179, 1786, 805, 4167, 4155, 623, 1410, - 1799, 1447, 1091, 1844, 1890, 4143, 429, 4111, 655, 688, - - 4111, 4098, 4088, 4079, 4077, 4073, 4076, 0, 4079, 0, - 1124, 967, 544, 561, 4062, 4064, 4048, 4047, 4033, 746, - 524, 1063, 413, 875, 1491, 4085, 4084, 4073, 1270, 1900, - 1944, 763, 904, 764, 4045, 4043, 4040, 4031, 4029, 4025, - 4032, 818, 4048, 4054, 3997, 1990, 2002, 2014, 4028, 4027, - 2024, 4016, 4003, 3991, 3979, 919, 1536, 1003, 1580, 1142, - 2037, 0, 1626, 2083, 1680, 1372, 2128, 2174, 869, 5604, - 3927, 3915, 3908, 924, 5604, 3922, 3885, 3898, 3891, 3901, - 3885, 0, 3869, 658, 698, 820, 1117, 1097, 3863, 3845, - 3846, 922, 995, 969, 1161, 3899, 3887, 2186, 2196, 3874, - - 3853, 3846, 3860, 3827, 3833, 3820, 3814, 3814, 3798, 3811, - 3807, 3808, 3808, 3738, 2240, 1017, 2279, 2291, 1637, 3720, - 3712, 3705, 3688, 2301, 1158, 3699, 3698, 2347, 1181, 1205, - 1209, 1724, 1761, 2359, 0, 1763, 2405, 1774, 1457, 2450, - 2496, 2521, 618, 1024, 1223, 1190, 1224, 1372, 1109, 1392, - 1394, 3636, 3622, 3620, 3604, 919, 3625, 3591, 1245, 1391, - 1152, 1118, 1818, 3622, 3615, 3598, 1503, 3568, 3564, 949, - 1380, 1065, 3549, 3540, 1088, 1290, 0, 0, 0, 0, - 3511, 2577, 1863, 1546, 3539, 3526, 3514, 1919, 2616, 1963, - 1590, 2660, 2706, 2056, 3487, 3467, 3444, 1692, 1879, 1979, - - 2096, 2104, 2147, 2106, 2718, 0, 2217, 2764, 2250, 1734, - 2809, 2855, 2880, 2086, 1807, 1369, 5604, 421, 2087, 1453, - 5604, 1812, 2088, 1454, 5604, 1455, 5604, 1248, 3394, 3373, - 1282, 2127, 1165, 1449, 3418, 3348, 2936, 3303, 3299, 3300, - 3282, 2951, 1218, 3257, 3006, 1119, 3044, 0, 1709, 3299, - 3269, 2260, 58, 2320, 1774, 3083, 0, 2380, 3129, 2424, - 1929, 3173, 3219, 3270, 3265, 3231, 2336, 2462, 2464, 2471, - 3257, 2477, 3243, 0, 2589, 3289, 2600, 2066, 3335, 3360, - 1324, 1376, 1803, 1498, 1586, 1845, 3219, 3184, 3166, 1870, - 1516, 2382, 3174, 2635, 3210, 3203, 3186, 2435, 3135, 3118, - - 3115, 3111, 3429, 1543, 0, 3486, 2679, 2737, 1632, 3103, - 3098, 3097, 3525, 3063, 2003, 2280, 2783, 2381, 3537, 0, - 2830, 3583, 3016, 2157, 3627, 3673, 3026, 3067, 2989, 2966, - 2228, 2472, 2474, 2695, 1485, 1575, 3685, 0, 2647, 1844, - 2064, 1642, 1566, 1847, 1826, 5604, 1926, 5604, 2925, 1967, - 1630, 2177, 1921, 2761, 2810, 2950, 2949, 3731, 2272, 1927, - 2155, 2386, 2766, 3741, 2074, 3780, 0, 2200, 2075, 3054, - 2847, 2844, 2824, 3066, 2809, 2745, 2485, 2600, 3102, 2617, - 3819, 0, 3150, 3865, 3192, 3036, 3909, 3955, 2749, 2732, - 3966, 2844, 2698, 1742, 2596, 2129, 5604, 2499, 1924, 1738, - - 2481, 2491, 1824, 5604, 1923, 2406, 3126, 3218, 3276, 3281, - 2419, 2880, 2357, 3360, 3496, 2391, 2277, 2273, 3074, 2142, - 2326, 2643, 2744, 3978, 3990, 4002, 2121, 1983, 4014, 1925, - 1865, 2831, 2951, 3506, 3084, 4026, 0, 3558, 4072, 3602, - 3272, 0, 1833, 1743, 1699, 3319, 1692, 2327, 5604, 2500, - 2300, 5604, 1894, 3646, 3704, 1652, 1511, 4118, 2328, 2791, - 4130, 2335, 4142, 4154, 3659, 3751, 1423, 1390, 1287, 3418, - 1239, 1226, 3130, 1189, 1169, 4166, 0, 3569, 2685, 5604, - 2834, 1989, 3761, 1099, 1057, 1014, 3614, 2686, 4178, 4190, - 4202, 3790, 3800, 3838, 916, 0, 704, 2743, 5604, 612, - - 2062, 5604, 522, 382, 4214, 4226, 2443, 4238, 4250, 3850, - 5604, 3887, 3928, 3516, 5604, 4045, 374, 208, 117, 3716, - 4260, 4297, 4334, 4091, 4270, 4280, 59, 4371, 3941, 5604, - 4307, 3771, 5604, 4423, 4444, 4465, 4486, 4507, 4528, 4549, - 4570, 4591, 4600, 2337, 4620, 4641, 2383, 4662, 4683, 4704, - 4725, 4746, 4767, 4788, 4809, 2483, 4830, 4839, 4847, 4856, - 4876, 4897, 4918, 2592, 4939, 4960, 4981, 5002, 5011, 5030, - 5039, 5048, 2516, 2694, 5056, 5064, 5072, 5081, 5089, 5096, - 5104, 5112, 5121, 5131, 2695, 2841, 5139, 5147, 5155, 2842, - 2872, 5164, 5174, 5194, 2873, 5203, 5211, 3122, 5220, 5230, - - 5250, 2116, 2228, 5259, 5271, 5280, 5290, 3123, 3161, 5299, - 5309, 5318, 5338, 2511, 5347, 5359, 3162, 3166, 5368, 5378, - 3169, 5387, 5397, 5417, 5438, 5459, 3189, 3208, 5479, 3283, - 5486, 5496, 2615, 2798, 5505, 2520, 5525, 3304, 3305, 5534, - 5544, 3311, 3319, 3430, 5552, 5562, 5582, 3814, 3553, 3569 + 0, 70, 72, 80, 87, 126, 178, 248, 156, 200, + 132, 140, 319, 0, 4925, 4863, 4908, 5587, 4903, 5587, + 388, 95, 5587, 5587, 4853, 5587, 142, 400, 198, 155, + 4878, 5587, 5587, 460, 4863, 37, 40, 516, 62, 4868, + 4851, 49, 4846, 4852, 4831, 575, 590, 125, 223, 613, + 33, 45, 4815, 38, 4805, 94, 4860, 4866, 434, 4822, + 4832, 136, 0, 5587, 4857, 5587, 0, 615, 674, 108, + 0, 4800, 5587, 70, 5587, 104, 5587, 152, 4799, 73, + 135, 5587, 161, 171, 651, 705, 749, 256, 245, 807, + 857, 4807, 82, 151, 913, 4801, 4811, 4797, 4807, 4802, + + 960, 0, 94, 4782, 645, 4831, 4824, 4824, 5587, 266, + 541, 204, 4813, 614, 718, 4771, 843, 947, 4767, 984, + 997, 1035, 4793, 4804, 572, 719, 276, 4790, 175, 1080, + 1125, 4767, 4772, 4761, 4757, 4759, 4756, 406, 4728, 4705, + 4698, 4688, 4688, 391, 5587, 173, 339, 637, 4666, 4663, + 4650, 4644, 4645, 397, 133, 385, 139, 349, 395, 257, + 4711, 731, 4710, 1019, 4658, 1036, 345, 0, 4706, 296, + 5587, 5587, 941, 393, 0, 4649, 654, 5587, 5587, 4643, + 552, 4641, 4687, 435, 595, 425, 4689, 649, 981, 1159, + 4637, 1165, 0, 1194, 1222, 1189, 1057, 1261, 4675, 1100, + + 1221, 840, 1311, 1367, 4631, 0, 4635, 4599, 4597, 4592, + 991, 4583, 4580, 4571, 4563, 4614, 4609, 1236, 1246, 1414, + 1281, 985, 1454, 4595, 4580, 1499, 674, 1545, 1590, 1635, + 4573, 4557, 4558, 4537, 4548, 4534, 4541, 4538, 4550, 4549, + 4543, 4522, 4518, 4528, 4525, 4522, 976, 398, 4489, 4487, + 4477, 4475, 4480, 541, 411, 4483, 396, 490, 499, 1438, + 515, 4535, 4522, 4521, 1682, 1692, 4520, 1737, 0, 4494, + 4480, 4464, 4476, 4464, 4471, 4470, 4454, 4453, 4444, 4430, + 4441, 625, 4407, 4470, 1782, 415, 0, 0, 1061, 658, + 4446, 4445, 1820, 606, 4358, 4357, 702, 1387, 1833, 1435, + + 1110, 1879, 1926, 4356, 660, 4338, 4333, 645, 677, 4345, + 4338, 4341, 4338, 4329, 4327, 4323, 4326, 0, 4329, 0, + 832, 176, 419, 648, 4312, 4314, 4298, 4312, 4298, 660, + 516, 1081, 708, 672, 1474, 4351, 4350, 4349, 1191, 1936, + 1981, 776, 4319, 678, 820, 4327, 4320, 4323, 4320, 4300, + 4298, 4294, 4301, 249, 4318, 4324, 4281, 2028, 2040, 2052, + 4313, 4312, 2062, 4312, 4310, 4309, 4308, 828, 1519, 1139, + 1565, 1162, 2075, 0, 1612, 2122, 1655, 1291, 2168, 2215, + 884, 5587, 4283, 4288, 4289, 4282, 965, 5587, 4276, 4267, + 4252, 4265, 4258, 4269, 4269, 0, 4251, 533, 781, 709, + + 980, 896, 4244, 4226, 4227, 937, 1079, 1109, 1116, 4280, + 4279, 2227, 2237, 4244, 4143, 4139, 4121, 4125, 4095, 4069, + 4071, 4053, 4053, 4042, 4014, 4031, 4017, 4011, 4006, 3948, + 2282, 1035, 2322, 2334, 1667, 3979, 3978, 3977, 3966, 2344, + 1178, 3965, 3953, 2391, 1198, 1299, 1403, 1712, 1749, 2403, + 0, 1762, 2450, 1792, 1484, 2496, 2543, 2568, 1188, 1246, + 1394, 1313, 1419, 1880, 1338, 1393, 1440, 1481, 1524, 3902, + 3890, 3855, 3847, 946, 3863, 3811, 1167, 1164, 575, 983, + 1802, 3860, 3859, 3858, 1577, 1525, 3811, 3801, 1526, 3786, + 1510, 1547, 3753, 3736, 1615, 1616, 0, 0, 0, 0, + + 3712, 2625, 1853, 1722, 3737, 3734, 3687, 1908, 2665, 1956, + 1812, 2710, 2757, 2001, 3675, 3667, 3666, 1968, 1454, 1758, + 1893, 2017, 2095, 2135, 2769, 0, 2148, 2816, 2188, 2105, + 2862, 2909, 1617, 5587, 2934, 1023, 1596, 1637, 5587, 1411, + 1001, 2122, 1695, 5587, 1752, 2181, 1763, 5587, 1858, 5587, + 1393, 3591, 3557, 1130, 2210, 1220, 1721, 3604, 3595, 2991, + 3549, 3540, 3006, 3490, 3464, 1829, 786, 3418, 3062, 1493, + 3101, 0, 1391, 3461, 3446, 2258, 2041, 2292, 2145, 3141, + 0, 2304, 3154, 2364, 2268, 3199, 3246, 3449, 3378, 3258, + 2311, 2380, 2416, 2425, 3364, 2429, 3270, 0, 2472, 3317, + + 2516, 2429, 3364, 3389, 1040, 893, 1915, 1836, 1498, 1981, + 2102, 3301, 3282, 3252, 2100, 1519, 2519, 3264, 2635, 3292, + 3282, 3258, 2646, 3206, 3179, 3459, 3182, 3161, 2007, 2008, + 0, 3517, 2652, 2685, 1619, 3173, 3177, 3142, 3557, 3087, + 2305, 2427, 2730, 2532, 3569, 0, 2791, 3582, 2836, 2483, + 3627, 3674, 2882, 3098, 3077, 3020, 2697, 2746, 2898, 3074, + 1273, 1309, 3686, 0, 2848, 1837, 2171, 1615, 2170, 5587, + 1399, 1871, 2216, 5587, 2264, 5587, 2834, 2368, 1742, 1858, + 2280, 2817, 3088, 2802, 2750, 3698, 2742, 2430, 2548, 2523, + 2452, 3708, 1976, 3748, 0, 2192, 2318, 3085, 2743, 2723, + + 2705, 3113, 2686, 2570, 2666, 2792, 3126, 3006, 3788, 0, + 3176, 3801, 3219, 3119, 3846, 3893, 2509, 2482, 3904, 3235, + 2442, 1772, 2403, 2736, 5587, 2794, 1916, 1979, 2329, 2288, + 2173, 5587, 2261, 2212, 3199, 3304, 3309, 3314, 2182, 2934, + 1982, 3389, 3527, 1994, 1948, 1908, 3448, 1902, 2737, 2889, + 3180, 3916, 3928, 3940, 1873, 1867, 3952, 1808, 1740, 3085, + 3155, 3537, 3298, 3964, 0, 3604, 3977, 3647, 3547, 4024, + 1731, 1704, 1674, 3658, 1667, 2886, 5587, 2888, 2080, 5587, + 2219, 3718, 3728, 1630, 1585, 4036, 2914, 3296, 4048, 2320, + 4060, 4072, 3763, 3769, 1578, 1492, 1467, 3615, 1368, 1248, + + 3330, 1233, 1220, 4084, 0, 2368, 3033, 5587, 3297, 2325, + 3821, 1183, 1094, 1016, 3833, 3126, 4096, 4108, 4120, 3866, + 3997, 4130, 924, 0, 830, 3181, 5587, 754, 2492, 5587, + 694, 586, 4142, 4154, 3100, 4166, 4178, 3878, 5587, 4188, + 4198, 3738, 5587, 4208, 571, 286, 244, 4009, 4218, 4256, + 4294, 4228, 4238, 4266, 55, 4332, 4248, 5587, 4304, 3779, + 5587, 4385, 4406, 4427, 4448, 4469, 4490, 4511, 4532, 4553, + 4562, 2563, 4582, 4603, 2523, 4624, 4645, 4666, 4687, 4708, + 4729, 4750, 4771, 2567, 4792, 4801, 4809, 4818, 4838, 4859, + 4880, 2794, 4901, 4922, 4943, 4964, 4985, 4994, 5013, 5022, + + 5031, 2466, 2897, 5039, 5047, 5055, 5064, 5072, 5079, 5087, + 5095, 5104, 5114, 2898, 3084, 5122, 5130, 5138, 3085, 3187, + 5147, 5157, 5177, 3234, 5186, 5194, 3235, 5203, 5213, 5233, + 2681, 2785, 5242, 5254, 5263, 5273, 3238, 3342, 5282, 5292, + 5301, 5321, 2832, 5330, 5342, 3347, 3348, 5351, 5361, 3352, + 5370, 5380, 5400, 5421, 5442, 3353, 3357, 5462, 3358, 5469, + 5479, 2926, 3006, 5488, 3559, 5508, 3460, 3598, 5517, 5527, + 3615, 3643, 5535, 5545, 5565, 4279, 3763, 3817 } ; -static yyconst short int yy_def[951] = +static yyconst short int yy_def[979] = { 0, - 833, 1, 1, 1, 834, 834, 835, 835, 836, 836, - 837, 837, 833, 13, 833, 838, 833, 833, 833, 833, - 839, 840, 833, 833, 841, 833, 842, 838, 28, 28, - 843, 833, 833, 833, 34, 34, 34, 37, 37, 37, - 37, 37, 37, 37, 838, 28, 838, 833, 839, 34, - 34, 37, 37, 37, 833, 844, 833, 845, 37, 37, - 838, 846, 833, 846, 833, 846, 833, 839, 833, 847, - 848, 833, 848, 833, 848, 833, 849, 850, 850, 850, - 833, 833, 851, 852, 853, 833, 86, 86, 86, 833, - 90, 90, 90, 93, 93, 93, 93, 93, 86, 89, - - 89, 838, 838, 833, 833, 854, 833, 855, 833, 840, - 856, 851, 840, 841, 841, 842, 857, 838, 838, 28, - 858, 120, 120, 120, 120, 859, 860, 37, 128, 129, - 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 838, 833, 838, 838, 833, 833, 833, 833, 833, 833, - 854, 838, 120, 838, 838, 838, 833, 833, 833, 833, - 861, 862, 838, 838, 863, 863, 833, 833, 833, 855, - 833, 864, 865, 865, 833, 833, 865, 865, 850, 833, - 850, 850, 833, 833, 851, 851, 851, 866, 867, 89, - 866, 868, 833, 833, 86, 195, 195, 195, 195, 833, - - 200, 201, 869, 201, 201, 201, 201, 201, 201, 89, - 89, 854, 870, 833, 833, 838, 216, 216, 120, 219, - 871, 833, 872, 833, 129, 225, 226, 226, 226, 226, - 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, - 838, 838, 833, 833, 833, 833, 833, 854, 838, 219, - 838, 838, 838, 833, 838, 833, 873, 874, 833, 89, - 260, 200, 201, 201, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 89, 89, 870, 838, 838, 216, 216, - 216, 838, 875, 876, 876, 285, 877, 876, 878, 224, - 833, 291, 291, 833, 291, 226, 226, 226, 226, 226, - - 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, - 838, 838, 838, 838, 833, 833, 833, 833, 833, 854, - 838, 838, 838, 838, 833, 833, 873, 873, 833, 260, - 200, 201, 879, 201, 201, 201, 201, 201, 201, 201, - 201, 89, 89, 89, 89, 216, 216, 216, 833, 880, - 880, 351, 880, 881, 882, 883, 833, 884, 294, 884, - 833, 361, 884, 833, 364, 364, 833, 364, 833, 833, - 226, 226, 226, 833, 833, 226, 226, 226, 226, 226, - 226, 226, 226, 838, 838, 838, 838, 838, 833, 833, - 833, 854, 838, 838, 838, 885, 886, 833, 89, 331, - - 879, 879, 201, 201, 201, 201, 201, 201, 201, 89, - 89, 89, 89, 89, 838, 838, 216, 216, 838, 887, - 887, 888, 889, 833, 833, 890, 891, 833, 892, 892, - 893, 367, 893, 833, 434, 893, 833, 437, 437, 833, - 437, 833, 442, 442, 442, 442, 442, 442, 442, 442, - 442, 838, 838, 838, 838, 838, 833, 833, 894, 838, - 838, 838, 833, 833, 895, 895, 833, 879, 879, 201, - 879, 201, 201, 201, 201, 201, 89, 89, 89, 89, - 89, 838, 482, 482, 833, 896, 897, 424, 833, 489, - 489, 833, 489, 833, 833, 898, 898, 833, 833, 899, - - 899, 900, 440, 900, 833, 505, 900, 833, 508, 508, - 833, 508, 833, 513, 513, 833, 833, 513, 513, 833, - 833, 513, 513, 833, 833, 833, 833, 838, 833, 833, - 901, 838, 838, 838, 902, 903, 833, 904, 904, 904, - 904, 833, 542, 905, 838, 838, 838, 547, 547, 833, - 906, 833, 907, 492, 907, 833, 556, 907, 833, 559, - 559, 833, 559, 908, 909, 833, 833, 910, 910, 911, - 912, 911, 833, 573, 911, 833, 576, 576, 576, 833, - 580, 580, 580, 580, 580, 580, 838, 833, 833, 913, - 838, 838, 838, 833, 833, 914, 914, 833, 915, 915, - - 915, 915, 833, 603, 916, 838, 606, 606, 606, 833, - 917, 918, 833, 919, 919, 920, 562, 920, 833, 619, - 920, 833, 622, 622, 833, 622, 833, 833, 921, 921, - 833, 833, 922, 922, 923, 923, 833, 637, 923, 580, - 580, 580, 580, 580, 833, 833, 833, 833, 833, 833, - 924, 913, 838, 925, 926, 927, 928, 833, 927, 929, - 929, 929, 929, 838, 838, 838, 666, 666, 838, 833, - 833, 930, 930, 833, 833, 931, 931, 932, 625, 932, - 833, 681, 932, 833, 684, 684, 833, 684, 933, 934, - 833, 833, 935, 935, 580, 833, 833, 580, 580, 580, - - 833, 924, 924, 833, 913, 838, 925, 925, 925, 925, - 936, 925, 937, 937, 833, 833, 927, 927, 833, 833, - 929, 929, 929, 666, 666, 666, 938, 939, 833, 833, - 940, 940, 941, 687, 941, 833, 736, 941, 833, 739, - 739, 942, 833, 933, 933, 833, 833, 833, 833, 580, - 580, 833, 913, 833, 833, 943, 944, 833, 929, 929, - 666, 838, 666, 666, 838, 833, 833, 938, 938, 833, - 833, 945, 945, 946, 946, 946, 776, 946, 833, 833, - 580, 947, 833, 833, 943, 943, 833, 929, 666, 666, - 666, 833, 833, 833, 833, 948, 948, 833, 833, 947, - - 947, 833, 949, 950, 833, 666, 838, 666, 666, 838, - 833, 833, 833, 833, 833, 833, 833, 949, 949, 833, - 838, 838, 838, 833, 833, 833, 838, 838, 838, 833, - 833, 833, 0, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833 + 861, 1, 1, 1, 862, 862, 863, 863, 864, 864, + 865, 865, 861, 13, 861, 866, 861, 861, 861, 861, + 867, 868, 861, 861, 869, 861, 870, 866, 28, 28, + 871, 861, 861, 861, 34, 34, 34, 34, 38, 38, + 38, 38, 38, 38, 38, 866, 28, 866, 861, 867, + 34, 34, 38, 38, 38, 861, 872, 861, 873, 38, + 38, 866, 874, 861, 874, 861, 874, 861, 867, 861, + 875, 876, 861, 876, 861, 876, 861, 877, 878, 878, + 878, 861, 861, 879, 880, 881, 861, 87, 87, 87, + 861, 91, 91, 91, 91, 95, 95, 95, 95, 95, + + 87, 90, 90, 866, 866, 861, 861, 882, 861, 883, + 861, 868, 884, 879, 868, 869, 869, 870, 885, 866, + 866, 28, 886, 122, 122, 122, 122, 887, 888, 38, + 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 866, 861, 866, 866, 861, 861, 861, + 861, 861, 861, 882, 866, 122, 866, 866, 866, 861, + 861, 861, 861, 889, 890, 866, 866, 891, 891, 861, + 861, 861, 883, 861, 892, 893, 893, 861, 861, 893, + 893, 894, 861, 894, 894, 861, 861, 879, 879, 879, + 895, 896, 90, 895, 897, 861, 861, 87, 198, 198, + + 198, 198, 861, 203, 204, 898, 204, 204, 204, 204, + 204, 204, 204, 90, 90, 882, 899, 861, 861, 866, + 220, 220, 122, 223, 900, 861, 901, 861, 131, 229, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 866, 866, 861, 861, + 861, 861, 861, 882, 866, 223, 866, 866, 866, 861, + 866, 861, 902, 903, 861, 90, 266, 203, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 90, 90, 899, 866, 866, 220, 220, 220, 866, + 904, 905, 905, 293, 906, 905, 907, 228, 861, 299, + + 299, 861, 299, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 866, 866, 866, 866, 861, 861, 861, 861, 861, 882, + 866, 866, 866, 866, 861, 861, 902, 902, 861, 266, + 203, 204, 204, 908, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 90, 90, 90, 90, 220, 220, 220, + 861, 909, 909, 363, 909, 910, 911, 912, 861, 913, + 302, 913, 861, 373, 913, 861, 376, 376, 861, 376, + 861, 861, 230, 230, 230, 230, 861, 861, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 866, 866, 866, + + 866, 866, 861, 861, 861, 882, 866, 866, 866, 914, + 915, 861, 90, 341, 204, 908, 908, 204, 204, 204, + 204, 204, 204, 204, 204, 90, 90, 90, 90, 90, + 866, 866, 220, 220, 866, 916, 916, 917, 918, 861, + 861, 919, 920, 861, 921, 921, 922, 379, 922, 861, + 450, 922, 861, 453, 453, 861, 453, 861, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 866, + 866, 866, 866, 866, 861, 861, 923, 866, 866, 866, + 861, 861, 924, 924, 861, 204, 908, 908, 204, 204, + 908, 204, 204, 204, 204, 204, 90, 90, 90, 90, + + 90, 866, 502, 502, 861, 925, 926, 440, 861, 509, + 509, 861, 509, 861, 861, 927, 927, 861, 861, 928, + 928, 929, 456, 929, 861, 525, 929, 861, 528, 528, + 861, 528, 861, 861, 861, 535, 535, 861, 861, 535, + 535, 535, 861, 861, 535, 535, 861, 861, 861, 861, + 866, 861, 861, 930, 866, 866, 866, 931, 932, 861, + 933, 933, 861, 933, 933, 563, 563, 934, 866, 866, + 866, 571, 571, 861, 935, 861, 936, 512, 936, 936, + 580, 936, 861, 583, 583, 861, 583, 937, 938, 861, + 861, 939, 939, 940, 941, 940, 861, 597, 940, 861, + + 600, 600, 600, 861, 604, 604, 604, 604, 604, 604, + 604, 866, 861, 861, 942, 866, 866, 866, 861, 861, + 943, 943, 861, 944, 944, 861, 944, 944, 626, 626, + 945, 866, 632, 632, 632, 861, 946, 947, 861, 948, + 948, 949, 586, 949, 949, 645, 949, 861, 648, 648, + 861, 648, 861, 861, 950, 950, 861, 861, 951, 951, + 952, 952, 952, 663, 952, 604, 604, 604, 861, 861, + 604, 604, 861, 861, 861, 861, 861, 861, 953, 942, + 866, 954, 955, 956, 957, 861, 956, 958, 958, 958, + 958, 866, 866, 866, 694, 694, 866, 861, 861, 959, + + 959, 861, 861, 960, 960, 961, 651, 961, 961, 709, + 961, 861, 712, 712, 861, 712, 962, 963, 861, 861, + 964, 964, 604, 861, 861, 604, 604, 604, 861, 953, + 953, 861, 942, 866, 954, 954, 954, 954, 965, 954, + 966, 966, 861, 861, 956, 956, 861, 861, 958, 958, + 958, 694, 694, 694, 967, 968, 861, 861, 969, 969, + 970, 715, 970, 970, 764, 970, 861, 767, 767, 767, + 861, 962, 962, 861, 861, 861, 861, 604, 604, 861, + 942, 861, 861, 971, 972, 861, 958, 958, 694, 866, + 694, 694, 866, 861, 861, 967, 967, 861, 861, 973, + + 973, 974, 974, 974, 804, 804, 861, 861, 604, 975, + 861, 861, 971, 971, 861, 958, 694, 694, 694, 861, + 861, 861, 861, 976, 976, 861, 861, 975, 975, 861, + 977, 978, 861, 694, 866, 694, 694, 866, 861, 861, + 861, 861, 861, 861, 861, 977, 977, 861, 866, 866, + 866, 861, 861, 861, 866, 866, 866, 861, 861, 861, + 0, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861 } ; -static yyconst short int yy_nxt[5675] = +static yyconst short int yy_nxt[5659] = { 0, 16, 17, 18, 19, 20, 21, 22, 23, 24, 16, 25, 26, 16, 16, 27, 28, 29, 30, 28, 28, 28, 28, 28, 28, 28, 31, 32, 33, 16, 34, - 35, 35, 35, 36, 37, 37, 37, 37, 38, 39, - 40, 37, 41, 42, 43, 44, 37, 37, 37, 37, - 37, 45, 16, 46, 46, 46, 46, 46, 46, 16, - 16, 16, 16, 16, 16, 16, 16, 47, 16, 16, - 48, 552, 55, 132, 49, 138, 56, 129, 133, 129, - 55, 129, 57, 554, 56, 58, 79, 18, 80, 81, - 57, 111, 131, 58, 136, 17, 63, 64, 153, 65, - - 50, 51, 152, 155, 52, 65, 171, 142, 137, 59, - 103, 112, 53, 60, 37, 54, 37, 59, 157, 65, - 66, 60, 37, 107, 37, 17, 63, 64, 158, 65, - 816, 79, 18, 80, 81, 65, 82, 113, 61, 178, - 142, 175, 103, 117, 117, 67, 61, 117, 117, 65, - 66, 143, 145, 181, 17, 18, 19, 72, 68, 176, - 144, 171, 142, 73, 74, 75, 174, 117, 124, 124, - 124, 124, 124, 125, 182, 67, 17, 18, 19, 76, - 68, 82, 146, 147, 174, 248, 148, 103, 103, 183, - 184, 118, 179, 242, 149, 201, 143, 150, 17, 18, - - 19, 72, 68, 180, 77, 164, 204, 73, 74, 75, - 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, - 103, 816, 180, 76, 182, 255, 69, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 17, 18, 19, 77, 68, - 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, - 198, 198, 198, 198, 198, 199, 210, 102, 121, 102, - 102, 102, 180, 102, 102, 211, 103, 102, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 103, 249, - 241, 102, 102, 102, 103, 69, 70, 70, 70, 70, - - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 33, 17, 18, 19, 33, 33, - 83, 23, 24, 33, 84, 26, 33, 33, 85, 86, - 87, 88, 86, 86, 86, 86, 86, 86, 86, 31, - 89, 33, 33, 90, 91, 91, 91, 92, 93, 93, - 93, 93, 94, 95, 96, 93, 97, 93, 98, 93, - 93, 93, 93, 93, 93, 69, 33, 99, 99, 99, - 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, - 100, 101, 100, 100, 107, 222, 103, 816, 111, 171, - 142, 277, 253, 181, 108, 816, 224, 109, 109, 109, - - 109, 109, 109, 109, 109, 109, 109, 119, 186, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, - 103, 183, 184, 122, 122, 122, 122, 122, 103, 103, - 369, 162, 162, 252, 187, 162, 162, 220, 220, 220, - 220, 220, 220, 180, 251, 103, 157, 122, 122, 122, - 122, 122, 122, 102, 370, 162, 158, 129, 103, 102, - 323, 583, 102, 102, 103, 102, 102, 102, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 121, 163, - 321, 102, 128, 128, 128, 128, 128, 129, 129, 129, - 129, 130, 129, 129, 129, 129, 129, 129, 129, 129, - - 129, 129, 129, 129, 103, 129, 122, 122, 122, 122, - 122, 122, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 129, 129, 129, 129, 129, 129, 129, - 129, 129, 129, 833, 222, 816, 107, 129, 129, 129, - 129, 129, 103, 102, 103, 290, 129, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 103, 314, 321, - 387, 102, 102, 102, 102, 102, 102, 141, 142, 102, - 102, 102, 321, 102, 102, 103, 393, 102, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 220, 250, 320, - 833, 102, 102, 102, 102, 103, 122, 122, 122, 122, - - 122, 122, 122, 122, 122, 122, 107, 167, 142, 168, - 833, 169, 103, 111, 802, 168, 108, 169, 388, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 231, - 103, 169, 169, 833, 232, 233, 113, 222, 234, 173, - 235, 188, 173, 173, 324, 171, 142, 188, 290, 173, - 188, 117, 117, 188, 188, 117, 117, 169, 833, 187, - 514, 129, 171, 142, 173, 151, 107, 190, 103, 188, - 111, 311, 312, 321, 313, 117, 170, 452, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 374, - 833, 372, 191, 188, 117, 103, 373, 117, 117, 118, - - 117, 117, 117, 117, 187, 103, 117, 117, 110, 103, - 110, 110, 174, 375, 110, 110, 187, 552, 110, 453, - 190, 117, 117, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 110, 110, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 193, 117, 190, 107, 103, - 194, 190, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 121, 190, 369, 374, 196, 196, 196, 196, - 196, 190, 190, 190, 190, 190, 190, 190, 190, 190, - 190, 190, 190, 190, 190, 190, 190, 190, 370, 375, - 196, 196, 196, 196, 196, 196, 190, 190, 190, 190, - - 190, 190, 190, 190, 190, 190, 190, 833, 392, 190, - 190, 190, 190, 190, 190, 190, 190, 190, 190, 833, - 353, 353, 353, 190, 190, 190, 190, 190, 342, 343, - 114, 344, 114, 114, 114, 410, 114, 114, 411, 454, - 114, 261, 261, 261, 261, 261, 261, 190, 190, 190, - 190, 190, 190, 190, 114, 114, 114, 190, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 121, 190, - 369, 103, 200, 200, 200, 200, 200, 201, 201, 201, - 201, 202, 201, 201, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 370, 203, 196, 196, 196, 196, - - 196, 196, 190, 190, 190, 190, 190, 190, 190, 190, - 190, 190, 190, 201, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 833, 107, 374, 103, 201, 201, 201, - 201, 201, 395, 222, 162, 162, 201, 267, 162, 162, - 401, 734, 268, 269, 290, 402, 270, 145, 271, 375, - 516, 190, 190, 190, 190, 190, 190, 833, 162, 196, - 196, 196, 196, 196, 196, 196, 196, 196, 196, 116, - 103, 102, 102, 116, 517, 102, 102, 146, 147, 116, - 528, 148, 163, 280, 280, 280, 280, 280, 281, 149, - 386, 459, 150, 116, 116, 102, 216, 217, 218, 216, - - 216, 216, 216, 216, 216, 216, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 357, 222, 103, 161, - 103, 102, 102, 161, 460, 102, 102, 783, 359, 161, - 415, 461, 103, 219, 219, 219, 219, 219, 219, 219, - 219, 219, 219, 161, 161, 102, 103, 219, 219, 219, - 219, 219, 257, 258, 259, 257, 257, 257, 257, 257, - 257, 257, 102, 102, 102, 102, 520, 129, 103, 515, - 783, 219, 219, 219, 219, 219, 219, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 121, 121, 524, - 521, 225, 225, 225, 225, 225, 261, 261, 261, 261, - - 261, 261, 261, 261, 261, 261, 362, 362, 362, 362, - 362, 363, 783, 525, 103, 219, 219, 219, 219, 219, - 219, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 833, 394, 545, 455, 129, 129, 129, 129, 129, - 185, 384, 185, 185, 385, 188, 185, 185, 103, 523, - 185, 188, 129, 456, 188, 833, 222, 188, 188, 102, - 102, 102, 102, 102, 102, 185, 185, 359, 103, 103, - 103, 190, 222, 188, 188, 103, 188, 188, 188, 534, - 188, 188, 833, 290, 188, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 222, 191, 188, 188, 188, - - 188, 117, 552, 103, 117, 117, 359, 117, 117, 117, - 117, 117, 103, 117, 117, 117, 103, 462, 357, 222, - 533, 117, 357, 222, 516, 520, 518, 190, 117, 117, - 359, 519, 592, 129, 432, 117, 117, 215, 215, 215, - 215, 215, 215, 215, 215, 215, 215, 107, 517, 521, - 201, 734, 193, 117, 260, 260, 260, 260, 260, 260, - 260, 260, 260, 260, 679, 604, 129, 129, 260, 260, - 260, 260, 260, 215, 215, 215, 215, 215, 215, 215, - 215, 215, 215, 325, 107, 326, 326, 326, 326, 326, - 326, 526, 260, 260, 260, 260, 260, 260, 190, 103, - - 766, 531, 190, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 121, 190, 527, 587, 262, 262, 262, - 262, 262, 201, 201, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201, 590, - 203, 260, 260, 260, 260, 260, 260, 190, 190, 190, - 190, 190, 190, 190, 190, 190, 190, 190, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 833, 641, - 516, 129, 201, 201, 201, 201, 201, 279, 279, 279, - 279, 279, 279, 279, 279, 279, 279, 435, 435, 435, - 435, 435, 436, 524, 517, 526, 190, 190, 190, 190, - - 190, 190, 277, 766, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 162, 129, 540, 525, 162, 527, - 522, 541, 642, 129, 162, 295, 295, 295, 295, 295, - 295, 295, 295, 295, 295, 129, 766, 129, 162, 162, - 103, 102, 103, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 532, 520, 524, 526, 282, 282, 282, - 282, 282, 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 506, 506, 506, 506, 506, 507, 521, 525, - 527, 282, 282, 282, 282, 282, 282, 284, 285, 286, - 286, 286, 286, 286, 286, 286, 286, 287, 357, 222, - - 103, 288, 288, 288, 288, 288, 396, 397, 398, 396, - 396, 396, 396, 396, 396, 396, 463, 593, 464, 464, - 464, 464, 464, 464, 783, 288, 288, 288, 288, 288, - 288, 222, 291, 292, 293, 291, 291, 291, 291, 291, - 291, 291, 294, 644, 647, 129, 295, 295, 295, 295, - 295, 426, 427, 428, 426, 426, 426, 426, 426, 426, - 426, 548, 548, 548, 548, 548, 549, 103, 648, 653, - 295, 295, 295, 295, 295, 295, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 121, 645, 833, 222, - 296, 296, 296, 296, 296, 368, 368, 368, 368, 368, - - 368, 368, 368, 368, 368, 557, 557, 557, 557, 557, - 558, 646, 699, 129, 282, 282, 282, 282, 282, 282, - 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 833, 703, 704, 129, 129, 129, 129, 129, 129, 357, - 222, 430, 430, 430, 430, 430, 430, 669, 669, 669, - 415, 359, 416, 416, 416, 416, 416, 416, 102, 102, - 102, 102, 102, 102, 325, 783, 328, 328, 328, 328, - 328, 329, 326, 326, 326, 326, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 121, 698, 103, 129, - 330, 330, 330, 330, 330, 434, 434, 434, 434, 434, - - 434, 434, 434, 434, 434, 494, 222, 495, 495, 495, - 495, 495, 495, 222, 330, 330, 330, 330, 330, 330, - 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, - 102, 102, 102, 102, 331, 331, 331, 331, 331, 441, - 441, 441, 441, 441, 441, 441, 441, 441, 441, 574, - 574, 574, 574, 574, 575, 357, 222, 222, 330, 330, - 330, 330, 330, 330, 346, 347, 348, 346, 346, 346, - 346, 346, 346, 346, 833, 222, 357, 222, 501, 501, - 501, 501, 501, 501, 751, 129, 432, 833, 432, 505, - 505, 505, 505, 505, 505, 505, 505, 505, 505, 554, - - 103, 351, 351, 352, 353, 353, 353, 353, 353, 353, - 353, 287, 357, 222, 358, 358, 358, 358, 358, 358, - 358, 358, 358, 358, 359, 703, 704, 645, 360, 360, - 360, 360, 360, 535, 536, 537, 535, 535, 535, 535, - 535, 535, 535, 129, 585, 643, 647, 222, 129, 582, - 129, 646, 360, 360, 360, 360, 360, 360, 222, 364, - 365, 366, 364, 364, 364, 364, 364, 364, 364, 367, - 648, 651, 107, 368, 368, 368, 368, 368, 547, 547, - 547, 547, 547, 547, 547, 547, 547, 547, 695, 700, - 679, 129, 129, 222, 129, 782, 107, 368, 368, 368, - - 368, 368, 368, 833, 359, 360, 360, 360, 360, 360, - 360, 360, 360, 360, 360, 399, 399, 399, 399, 399, - 399, 399, 399, 399, 399, 107, 652, 647, 696, 399, - 399, 399, 399, 399, 493, 493, 493, 493, 493, 493, - 493, 493, 493, 493, 620, 620, 620, 620, 620, 621, - 617, 648, 697, 399, 399, 399, 399, 399, 399, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 750, - 654, 129, 103, 400, 400, 400, 400, 400, 556, 556, - 556, 556, 556, 556, 556, 556, 556, 556, 706, 753, - 801, 802, 654, 222, 654, 654, 766, 399, 399, 399, - - 399, 399, 399, 415, 432, 416, 416, 416, 416, 416, - 416, 416, 416, 416, 416, 415, 552, 417, 417, 417, - 417, 417, 417, 417, 417, 417, 417, 415, 554, 418, - 418, 418, 418, 418, 419, 416, 416, 416, 416, 421, - 421, 421, 421, 421, 421, 421, 421, 421, 421, 287, - 357, 222, 430, 430, 430, 430, 430, 430, 430, 430, - 430, 430, 359, 801, 802, 696, 429, 429, 429, 429, - 429, 564, 565, 566, 564, 564, 564, 564, 564, 564, - 564, 638, 638, 638, 638, 638, 639, 664, 664, 697, - 429, 429, 429, 429, 429, 429, 357, 222, 431, 431, - - 431, 431, 431, 431, 431, 431, 431, 431, 432, 357, - 222, 129, 433, 433, 433, 433, 433, 357, 222, 833, - 222, 432, 129, 129, 129, 103, 103, 595, 595, 503, - 696, 503, 581, 584, 766, 586, 433, 433, 433, 433, - 433, 433, 222, 437, 438, 439, 437, 437, 437, 437, - 437, 437, 437, 440, 697, 715, 833, 441, 441, 441, - 441, 441, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 682, 682, 682, 682, 682, 683, 103, 107, - 833, 441, 441, 441, 441, 441, 441, 833, 591, 433, - 433, 433, 433, 433, 433, 433, 433, 433, 433, 463, - - 721, 466, 466, 466, 466, 466, 467, 464, 464, 464, - 464, 399, 399, 399, 399, 399, 399, 399, 399, 399, - 399, 102, 102, 102, 102, 399, 399, 399, 399, 399, - 357, 222, 569, 569, 569, 569, 569, 569, 705, 596, - 596, 627, 503, 628, 628, 628, 628, 628, 628, 399, - 399, 399, 399, 399, 399, 482, 483, 484, 482, 482, - 482, 482, 482, 482, 482, 573, 573, 573, 573, 573, - 573, 573, 573, 573, 573, 611, 612, 613, 611, 611, - 611, 611, 611, 611, 611, 715, 715, 720, 720, 720, - 715, 103, 415, 552, 416, 416, 416, 416, 416, 416, - - 416, 416, 416, 416, 415, 617, 416, 416, 416, 416, - 416, 416, 416, 416, 416, 416, 489, 490, 491, 489, - 489, 489, 489, 489, 489, 489, 492, 748, 748, 779, - 493, 493, 493, 493, 493, 563, 563, 563, 563, 563, - 563, 563, 563, 563, 563, 781, 109, 129, 761, 109, - 222, 749, 749, 780, 493, 493, 493, 493, 493, 493, - 494, 432, 497, 497, 497, 497, 497, 498, 495, 495, - 495, 495, 357, 222, 501, 501, 501, 501, 501, 501, - 501, 501, 501, 501, 432, 654, 103, 833, 500, 500, - 500, 500, 500, 552, 833, 615, 615, 615, 615, 615, - - 615, 172, 172, 172, 715, 554, 617, 654, 714, 654, - 655, 833, 500, 500, 500, 500, 500, 500, 357, 222, - 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, - 503, 754, 722, 103, 504, 504, 504, 504, 504, 619, - 619, 619, 619, 619, 619, 619, 619, 619, 619, 594, - 595, 595, 595, 595, 595, 595, 806, 103, 504, 504, - 504, 504, 504, 504, 222, 508, 509, 510, 508, 508, - 508, 508, 508, 508, 508, 511, 222, 357, 222, 512, - 512, 512, 512, 512, 357, 222, 222, 503, 222, 503, - 833, 222, 215, 704, 103, 215, 571, 503, 552, 571, - - 748, 779, 571, 512, 512, 512, 512, 512, 512, 833, - 617, 504, 504, 504, 504, 504, 504, 504, 504, 504, - 504, 102, 595, 595, 749, 780, 326, 102, 326, 755, - 102, 102, 755, 102, 102, 102, 129, 129, 129, 129, - 129, 129, 129, 129, 129, 129, 129, 129, 752, 102, - 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 129, 129, 129, 513, 129, 129, 129, 129, 129, - 129, 129, 103, 129, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 545, 546, 546, 546, 546, 546, 546, 546, 546, - - 546, 546, 357, 222, 634, 634, 634, 634, 634, 634, - 172, 172, 172, 552, 571, 637, 637, 637, 637, 637, - 637, 637, 637, 637, 637, 679, 743, 743, 103, 552, - 833, 553, 553, 553, 553, 553, 553, 553, 553, 553, - 553, 554, 679, 129, 833, 555, 555, 555, 555, 555, - 656, 657, 658, 659, 656, 656, 656, 656, 656, 656, - 357, 222, 694, 694, 694, 694, 694, 694, 833, 555, - 555, 555, 555, 555, 555, 559, 560, 561, 559, 559, - 559, 559, 559, 559, 559, 562, 779, 798, 759, 563, - 563, 563, 563, 563, 666, 666, 666, 666, 666, 666, - - 666, 666, 666, 666, 327, 464, 327, 464, 357, 222, - 780, 799, 222, 563, 563, 563, 563, 563, 563, 833, - 571, 555, 555, 555, 555, 555, 555, 555, 555, 555, - 555, 357, 222, 569, 569, 569, 569, 569, 569, 569, - 569, 569, 569, 503, 798, 833, 222, 568, 568, 568, - 568, 568, 667, 667, 667, 667, 667, 668, 669, 669, - 669, 669, 708, 222, 709, 710, 711, 833, 799, 833, - 617, 568, 568, 568, 568, 568, 568, 357, 222, 570, - 570, 570, 570, 570, 570, 570, 570, 570, 570, 571, - 760, 833, 833, 572, 572, 572, 572, 572, 626, 626, - - 626, 626, 626, 626, 626, 626, 626, 626, 723, 744, - 744, 708, 712, 709, 710, 711, 833, 572, 572, 572, - 572, 572, 572, 222, 576, 577, 578, 576, 576, 576, - 576, 576, 576, 576, 554, 798, 788, 670, 579, 579, - 579, 579, 579, 552, 552, 677, 677, 677, 677, 677, - 677, 465, 495, 465, 495, 617, 679, 670, 222, 799, - 670, 714, 579, 579, 579, 579, 579, 579, 833, 571, - 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 102, 129, 496, 464, 496, 464, 102, 707, 707, 102, - 102, 707, 102, 102, 102, 129, 129, 129, 129, 129, - - 129, 129, 129, 129, 129, 707, 707, 707, 102, 129, - 129, 129, 129, 129, 129, 129, 580, 129, 129, 129, - 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 103, 129, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 594, 597, 597, 597, 597, 597, 598, 595, 595, 595, - 595, 190, 715, 715, 552, 190, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 734, 190, 701, 627, - 201, 201, 201, 603, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, - - 201, 201, 627, 203, 190, 190, 190, 190, 190, 190, - 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, - 190, 606, 607, 608, 609, 606, 606, 606, 606, 606, - 606, 681, 681, 681, 681, 681, 681, 681, 681, 681, - 681, 689, 690, 691, 689, 689, 689, 689, 689, 689, - 689, 737, 737, 737, 737, 737, 738, 103, 545, 546, - 546, 546, 546, 546, 546, 546, 546, 546, 546, 727, - 728, 729, 727, 727, 727, 727, 727, 727, 727, 670, - 627, 671, 671, 671, 671, 671, 671, 715, 554, 716, - 716, 716, 716, 716, 716, 103, 552, 833, 615, 615, - - 615, 615, 615, 615, 615, 615, 615, 615, 554, 734, - 670, 670, 614, 614, 614, 614, 614, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 833, 488, 833, - 833, 833, 495, 628, 495, 628, 614, 614, 614, 614, - 614, 614, 552, 552, 616, 616, 616, 616, 616, 616, - 616, 616, 616, 616, 617, 734, 663, 662, 618, 618, - 618, 618, 618, 552, 661, 732, 732, 732, 732, 732, - 732, 629, 671, 629, 671, 679, 672, 712, 672, 628, - 660, 628, 618, 618, 618, 618, 618, 618, 622, 623, - 624, 622, 622, 622, 622, 622, 622, 622, 625, 716, - - 594, 716, 626, 626, 626, 626, 626, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 594, 717, 708, - 717, 709, 710, 711, 594, 103, 626, 626, 626, 626, - 626, 626, 833, 650, 618, 618, 618, 618, 618, 618, - 618, 618, 618, 618, 627, 649, 630, 630, 630, 630, - 630, 631, 628, 628, 628, 628, 357, 222, 634, 634, - 634, 634, 634, 634, 634, 634, 634, 634, 571, 712, - 103, 222, 633, 633, 633, 633, 633, 833, 627, 709, - 710, 711, 833, 627, 833, 833, 711, 777, 777, 777, - 777, 777, 778, 671, 488, 671, 633, 633, 633, 633, - - 633, 633, 357, 222, 635, 635, 635, 635, 635, 635, - 635, 635, 635, 635, 767, 768, 767, 768, 636, 636, - 636, 636, 636, 775, 355, 605, 775, 712, 602, 784, - 775, 784, 712, 222, 743, 743, 743, 743, 743, 743, - 601, 600, 636, 636, 636, 636, 636, 636, 833, 599, - 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, - 102, 713, 594, 713, 713, 713, 102, 713, 713, 102, - 102, 713, 102, 102, 102, 129, 129, 129, 129, 129, - 129, 129, 129, 129, 129, 713, 713, 713, 102, 129, - 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, - - 129, 129, 129, 129, 129, 129, 129, 640, 129, 129, - 129, 103, 129, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 645, 766, 594, 767, 767, 767, 767, 767, 767, 190, - 785, 589, 785, 190, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 646, 190, 588, 494, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, - 494, 203, 190, 190, 190, 190, 190, 190, 190, 190, - 190, 190, 190, 190, 190, 190, 190, 190, 190, 664, - - 494, 665, 665, 665, 665, 665, 665, 665, 665, 665, - 665, 756, 757, 758, 756, 756, 756, 756, 756, 756, - 756, 742, 742, 742, 742, 742, 742, 742, 742, 742, - 742, 811, 811, 811, 811, 811, 811, 103, 670, 488, - 673, 673, 673, 673, 673, 674, 671, 671, 671, 671, - 552, 355, 677, 677, 677, 677, 677, 677, 677, 677, - 677, 677, 617, 817, 287, 817, 676, 676, 676, 676, - 676, 552, 544, 773, 773, 773, 773, 773, 773, 818, - 543, 818, 552, 734, 797, 797, 797, 797, 797, 797, - 676, 676, 676, 676, 676, 676, 552, 542, 678, 678, - - 678, 678, 678, 678, 678, 678, 678, 678, 679, 539, - 538, 463, 680, 680, 680, 680, 680, 776, 776, 776, - 776, 776, 776, 776, 776, 776, 776, 783, 463, 784, - 784, 784, 784, 784, 784, 463, 680, 680, 680, 680, - 680, 680, 684, 685, 686, 684, 684, 684, 684, 684, - 684, 684, 687, 530, 529, 103, 688, 688, 688, 688, - 688, 755, 755, 755, 755, 755, 755, 755, 755, 755, - 755, 103, 761, 103, 762, 762, 762, 762, 762, 762, - 688, 688, 688, 688, 688, 688, 833, 103, 680, 680, - 680, 680, 680, 680, 680, 680, 680, 680, 357, 222, - - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 103, 494, 494, 488, 693, 693, 693, 693, 693, 755, - 755, 755, 755, 755, 755, 755, 755, 755, 755, 816, - 355, 817, 817, 817, 817, 817, 817, 287, 693, 693, - 693, 693, 693, 693, 715, 287, 718, 718, 718, 718, - 718, 719, 720, 720, 720, 720, 724, 725, 726, 724, - 724, 724, 724, 724, 724, 724, 792, 793, 794, 792, - 792, 792, 792, 792, 792, 792, 803, 804, 805, 803, - 803, 803, 803, 803, 803, 803, 830, 830, 830, 830, - 830, 830, 103, 664, 481, 665, 665, 665, 665, 665, - - 665, 665, 665, 665, 665, 811, 811, 811, 811, 811, - 811, 811, 811, 811, 811, 812, 812, 812, 812, 812, - 812, 812, 812, 812, 812, 480, 815, 479, 478, 815, - 477, 103, 552, 815, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 679, 476, 475, 474, 731, 731, - 731, 731, 731, 813, 813, 813, 813, 813, 814, 811, - 811, 811, 811, 806, 473, 807, 807, 807, 807, 807, - 807, 472, 731, 731, 731, 731, 731, 731, 552, 471, - 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, - 734, 470, 469, 468, 735, 735, 735, 735, 735, 833, - - 463, 103, 811, 811, 811, 811, 811, 811, 811, 811, - 811, 811, 463, 389, 458, 457, 451, 450, 735, 735, - 735, 735, 735, 735, 739, 740, 741, 739, 739, 739, - 739, 739, 739, 739, 449, 448, 447, 446, 742, 742, - 742, 742, 742, 811, 811, 811, 811, 811, 811, 811, - 811, 811, 811, 445, 444, 443, 827, 827, 827, 827, - 827, 827, 742, 742, 742, 742, 742, 742, 833, 442, - 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, - 222, 745, 745, 745, 745, 745, 746, 743, 743, 743, - 743, 761, 103, 762, 762, 762, 762, 762, 762, 762, - - 762, 762, 762, 761, 424, 763, 763, 763, 763, 763, - 763, 763, 763, 763, 763, 761, 355, 764, 764, 764, - 764, 764, 765, 762, 762, 762, 762, 766, 287, 769, - 769, 769, 769, 769, 770, 767, 767, 767, 767, 552, - 420, 773, 773, 773, 773, 773, 773, 773, 773, 773, - 773, 734, 287, 127, 414, 772, 772, 772, 772, 772, - 824, 825, 826, 824, 824, 824, 824, 824, 824, 824, - 413, 412, 409, 408, 407, 406, 405, 404, 403, 772, - 772, 772, 772, 772, 772, 552, 325, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 325, 325, 389, - - 391, 775, 775, 775, 775, 775, 830, 830, 830, 830, - 830, 830, 830, 830, 830, 830, 389, 390, 389, 383, - 382, 381, 380, 379, 378, 775, 775, 775, 775, 775, - 775, 783, 377, 786, 786, 786, 786, 786, 787, 784, - 784, 784, 784, 102, 376, 789, 790, 791, 789, 789, - 789, 789, 789, 789, 789, 761, 371, 762, 762, 762, - 762, 762, 762, 762, 762, 762, 762, 761, 121, 762, - 762, 762, 762, 762, 762, 762, 762, 762, 762, 552, - 287, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797, 806, 355, 807, 807, 807, 807, 807, 807, 807, - - 807, 807, 807, 806, 287, 808, 808, 808, 808, 808, - 808, 808, 808, 808, 808, 806, 127, 809, 809, 809, - 809, 809, 810, 807, 807, 807, 807, 816, 107, 819, - 819, 819, 819, 819, 820, 817, 817, 817, 817, 102, - 345, 821, 822, 823, 821, 821, 821, 821, 821, 821, - 821, 806, 341, 807, 807, 807, 807, 807, 807, 807, - 807, 807, 807, 806, 340, 807, 807, 807, 807, 807, - 807, 807, 807, 807, 807, 827, 827, 827, 827, 827, - 827, 827, 827, 827, 827, 824, 824, 824, 824, 824, - 824, 824, 824, 824, 824, 831, 831, 831, 831, 831, - - 832, 830, 830, 830, 830, 339, 338, 337, 336, 335, - 334, 103, 821, 821, 821, 821, 821, 821, 821, 821, - 821, 821, 830, 830, 830, 830, 830, 830, 830, 830, - 830, 830, 333, 332, 194, 325, 325, 256, 322, 319, - 318, 317, 316, 315, 310, 309, 308, 307, 103, 828, - 828, 828, 828, 828, 829, 827, 827, 827, 827, 306, - 305, 304, 303, 302, 301, 300, 299, 298, 297, 127, - 119, 107, 107, 275, 274, 273, 272, 266, 265, 264, - 263, 833, 191, 256, 179, 103, 827, 827, 827, 827, - 827, 827, 827, 827, 827, 827, 180, 174, 174, 166, - - 254, 160, 160, 247, 246, 245, 244, 243, 240, 239, - 238, 237, 236, 230, 229, 228, 227, 226, 127, 102, - 127, 193, 103, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 33, 33, 33, 33, 33, 33, + 35, 35, 35, 36, 37, 38, 38, 38, 38, 39, + 40, 41, 38, 42, 43, 44, 45, 38, 38, 38, + 38, 38, 46, 16, 47, 47, 47, 47, 47, 47, + 16, 16, 16, 16, 16, 16, 16, 16, 48, 16, + 16, 49, 131, 56, 184, 50, 131, 57, 139, 131, + 141, 56, 134, 58, 131, 57, 59, 133, 17, 64, + 65, 58, 66, 140, 59, 160, 178, 155, 66, 135, + + 113, 51, 52, 156, 136, 161, 53, 105, 158, 174, + 145, 60, 66, 67, 54, 61, 38, 55, 38, 60, + 114, 204, 177, 61, 38, 183, 38, 17, 64, 65, + 179, 66, 207, 80, 18, 81, 82, 66, 185, 68, + 62, 80, 18, 81, 82, 119, 119, 115, 62, 119, + 119, 66, 67, 181, 145, 214, 177, 17, 18, 19, + 73, 69, 186, 187, 215, 182, 74, 75, 76, 119, + 126, 126, 126, 126, 126, 127, 113, 105, 68, 17, + 18, 19, 77, 69, 83, 105, 146, 183, 105, 226, + 204, 105, 83, 208, 120, 147, 189, 146, 255, 400, + + 228, 17, 18, 19, 73, 69, 167, 257, 78, 861, + 74, 75, 76, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 190, 148, 105, 77, 247, 105, 861, + 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 17, + 18, 19, 78, 69, 149, 150, 115, 844, 160, 151, + 201, 201, 201, 201, 201, 202, 426, 152, 161, 427, + 153, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 224, 224, 224, 224, 224, 224, 174, 145, 844, + + 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 33, + 17, 18, 19, 33, 33, 84, 23, 24, 33, 85, + 26, 33, 33, 86, 87, 88, 89, 87, 87, 87, + 87, 87, 87, 87, 31, 90, 33, 33, 91, 92, + 92, 92, 93, 94, 95, 95, 95, 95, 96, 97, + 98, 95, 99, 95, 100, 95, 95, 95, 95, 95, + 95, 70, 33, 101, 101, 101, 101, 101, 101, 102, + 102, 102, 102, 102, 102, 102, 102, 103, 102, 102, + 109, 105, 174, 145, 174, 145, 248, 105, 104, 109, + + 110, 105, 261, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 121, 258, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 123, 186, 187, 285, 124, + 124, 124, 124, 124, 124, 401, 184, 165, 165, 236, + 237, 165, 165, 105, 256, 238, 239, 105, 105, 240, + 105, 241, 105, 259, 124, 124, 124, 124, 124, 124, + 104, 165, 254, 105, 324, 331, 104, 105, 331, 104, + 104, 105, 104, 104, 104, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 123, 166, 183, 104, 130, + 130, 130, 130, 130, 130, 131, 131, 131, 131, 132, + + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 105, 131, 124, 124, 124, 124, 124, 124, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 861, 105, 109, 333, 131, 131, 131, 131, 131, + 131, 105, 470, 174, 145, 131, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 331, 105, 105, 407, + 104, 104, 104, 104, 104, 104, 144, 145, 104, 104, + 104, 334, 104, 104, 844, 105, 104, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 330, 185, 844, + + 104, 104, 104, 104, 177, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 109, 170, 145, 171, 113, + 172, 365, 365, 365, 171, 110, 172, 105, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 148, 861, + 172, 172, 354, 355, 556, 356, 104, 183, 104, 104, + 104, 191, 104, 104, 861, 176, 104, 191, 176, 176, + 191, 381, 109, 191, 191, 176, 190, 172, 149, 150, + 104, 104, 104, 151, 861, 154, 109, 193, 387, 191, + 176, 152, 385, 123, 153, 382, 173, 386, 226, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 298, + + 105, 190, 388, 194, 191, 119, 402, 844, 119, 119, + 105, 119, 119, 119, 119, 416, 226, 119, 119, 112, + 417, 112, 112, 406, 105, 112, 112, 298, 472, 112, + 409, 193, 119, 119, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 112, 112, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 830, 196, 119, 193, + 105, 105, 197, 193, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 123, 193, 331, 381, 199, 199, + 199, 199, 199, 199, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + + 193, 382, 471, 199, 199, 199, 199, 199, 199, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 861, 387, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 861, 105, 630, 204, 193, 193, 193, 193, + 193, 193, 226, 576, 116, 388, 116, 116, 116, 398, + 116, 116, 399, 298, 116, 267, 267, 267, 267, 267, + 267, 193, 193, 193, 193, 193, 193, 193, 116, 116, + 116, 193, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 123, 193, 105, 381, 203, 203, 203, 203, + 203, 203, 204, 204, 204, 204, 205, 204, 204, 204, + + 204, 204, 204, 204, 204, 204, 204, 204, 204, 382, + 206, 199, 199, 199, 199, 199, 199, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 861, 109, + 668, 131, 204, 204, 204, 204, 204, 204, 105, 762, + 119, 119, 204, 474, 119, 119, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 387, 193, 193, 193, + 193, 193, 193, 861, 119, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 118, 113, 104, 104, 118, + 388, 104, 104, 321, 322, 118, 323, 473, 105, 120, + + 288, 288, 288, 288, 288, 289, 861, 477, 551, 118, + 118, 104, 220, 221, 222, 220, 220, 220, 220, 220, + 220, 220, 165, 165, 274, 275, 165, 165, 105, 811, + 276, 277, 105, 190, 278, 105, 279, 164, 131, 104, + 104, 164, 608, 104, 104, 557, 165, 164, 431, 105, + 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, + 131, 164, 164, 104, 223, 223, 223, 223, 223, 223, + 605, 166, 263, 264, 265, 263, 263, 263, 263, 263, + 263, 263, 104, 104, 104, 104, 667, 105, 131, 223, + 223, 223, 223, 223, 223, 229, 229, 229, 229, 229, + + 229, 229, 229, 229, 229, 123, 123, 811, 478, 229, + 229, 229, 229, 229, 229, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 374, 374, 374, 374, 374, + 375, 105, 109, 105, 223, 223, 223, 223, 223, 223, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 861, 408, 369, 226, 131, 131, 131, 131, 131, 131, + 188, 105, 188, 188, 371, 191, 188, 188, 105, 109, + 188, 191, 479, 480, 191, 861, 226, 191, 191, 104, + 104, 104, 104, 104, 104, 188, 188, 371, 615, 861, + 119, 193, 226, 191, 119, 191, 811, 191, 191, 191, + + 119, 191, 191, 298, 335, 191, 336, 336, 336, 336, + 336, 336, 226, 861, 119, 119, 105, 194, 191, 191, + 191, 191, 119, 371, 554, 119, 119, 555, 119, 119, + 119, 119, 535, 861, 119, 119, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 576, 861, 193, 119, + 119, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 861, 105, 762, 196, 119, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 369, 226, 617, 536, + 266, 266, 266, 266, 266, 266, 287, 287, 287, 287, + + 287, 287, 287, 287, 287, 287, 451, 451, 451, 451, + 451, 452, 369, 226, 538, 266, 266, 266, 266, 266, + 266, 193, 861, 226, 371, 193, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 123, 193, 539, 543, + 268, 268, 268, 268, 268, 268, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 544, 206, 266, 266, 266, 266, 266, + 266, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 861, 707, 861, 861, 204, 204, 204, 204, + + 204, 204, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 104, 104, 104, 104, 369, 226, 861, 861, + 861, 193, 193, 193, 193, 193, 193, 285, 448, 286, + 286, 286, 286, 286, 286, 286, 286, 286, 286, 165, + 537, 861, 545, 165, 861, 105, 727, 131, 131, 165, + 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, + 607, 540, 612, 165, 165, 861, 105, 104, 226, 290, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 371, + 794, 546, 547, 290, 290, 290, 290, 290, 290, 410, + 411, 412, 410, 410, 410, 410, 410, 410, 410, 526, + + 526, 526, 526, 526, 527, 794, 548, 569, 290, 290, + 290, 290, 290, 290, 292, 293, 294, 294, 294, 294, + 294, 294, 294, 294, 295, 549, 533, 538, 296, 296, + 296, 296, 296, 296, 442, 443, 444, 442, 442, 442, + 442, 442, 442, 442, 672, 105, 131, 564, 543, 550, + 534, 539, 565, 296, 296, 296, 296, 296, 296, 226, + 299, 300, 301, 299, 299, 299, 299, 299, 299, 299, + 302, 105, 544, 681, 303, 303, 303, 303, 303, 303, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 481, 794, 482, 482, 482, 482, 482, 482, 811, 303, + + 303, 303, 303, 303, 303, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 123, 547, 549, 533, 304, + 304, 304, 304, 304, 304, 369, 226, 446, 446, 446, + 446, 446, 446, 131, 697, 697, 697, 371, 538, 606, + 548, 550, 534, 811, 290, 290, 290, 290, 290, 290, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 861, 726, 539, 131, 131, 131, 131, 131, 131, 131, + 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, + 431, 226, 432, 432, 432, 432, 432, 432, 226, 104, + 104, 104, 104, 104, 104, 335, 543, 338, 338, 338, + + 338, 338, 339, 336, 336, 336, 336, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 123, 226, 105, + 544, 340, 340, 340, 340, 340, 340, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 572, 572, 572, + 572, 572, 573, 731, 732, 226, 340, 340, 340, 340, + 340, 340, 341, 341, 341, 341, 341, 341, 341, 341, + 341, 341, 861, 226, 547, 707, 341, 341, 341, 341, + 341, 341, 226, 105, 448, 369, 226, 521, 521, 521, + 521, 521, 521, 448, 610, 369, 226, 448, 548, 131, + 618, 340, 340, 340, 340, 340, 340, 358, 359, 360, + + 358, 358, 358, 358, 358, 358, 358, 525, 525, 525, + 525, 525, 525, 525, 525, 525, 525, 558, 559, 560, + 558, 558, 558, 558, 558, 558, 558, 581, 581, 581, + 581, 581, 582, 643, 105, 363, 363, 364, 365, 365, + 365, 365, 365, 365, 365, 295, 369, 226, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 371, 549, + 109, 629, 372, 372, 372, 372, 372, 372, 571, 571, + 571, 571, 571, 571, 571, 571, 571, 571, 204, 671, + 794, 861, 723, 550, 131, 131, 794, 372, 372, 372, + 372, 372, 372, 226, 376, 377, 378, 376, 376, 376, + + 376, 376, 376, 376, 379, 861, 369, 226, 380, 380, + 380, 380, 380, 380, 728, 743, 669, 541, 448, 131, + 733, 743, 542, 513, 513, 513, 513, 513, 513, 513, + 513, 513, 513, 380, 380, 380, 380, 380, 380, 861, + 670, 372, 372, 372, 372, 372, 372, 372, 372, 372, + 372, 413, 413, 413, 413, 413, 413, 413, 413, 413, + 413, 743, 778, 131, 131, 413, 413, 413, 413, 413, + 413, 580, 580, 580, 580, 580, 580, 580, 580, 580, + 580, 514, 673, 515, 515, 515, 515, 515, 515, 692, + 413, 413, 413, 413, 413, 413, 414, 414, 414, 414, + + 414, 414, 414, 414, 414, 414, 674, 743, 673, 675, + 414, 414, 414, 414, 414, 414, 588, 589, 590, 588, + 588, 588, 588, 588, 588, 588, 779, 131, 105, 131, + 369, 226, 674, 676, 742, 413, 413, 413, 413, 413, + 413, 431, 523, 432, 432, 432, 432, 432, 432, 432, + 432, 432, 432, 431, 576, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 431, 578, 434, 434, 434, + 434, 434, 435, 432, 432, 432, 432, 437, 437, 437, + 437, 437, 437, 437, 437, 437, 437, 295, 369, 226, + 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, + + 371, 679, 109, 675, 445, 445, 445, 445, 445, 445, + 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, + 598, 598, 598, 598, 598, 599, 809, 676, 131, 445, + 445, 445, 445, 445, 445, 369, 226, 447, 447, 447, + 447, 447, 447, 447, 447, 447, 447, 448, 861, 226, + 131, 449, 449, 449, 449, 449, 449, 680, 861, 131, + 523, 369, 226, 593, 593, 593, 593, 593, 593, 609, + 578, 669, 724, 523, 731, 732, 449, 449, 449, 449, + 449, 449, 226, 453, 454, 455, 453, 453, 453, 453, + 453, 453, 453, 456, 782, 670, 725, 457, 457, 457, + + 457, 457, 457, 597, 597, 597, 597, 597, 597, 597, + 597, 597, 597, 104, 104, 104, 104, 673, 131, 131, + 810, 109, 457, 457, 457, 457, 457, 457, 861, 611, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 481, 674, 484, 484, 484, 484, 484, 485, 482, 482, + 482, 482, 413, 413, 413, 413, 413, 413, 413, 413, + 413, 413, 105, 109, 105, 675, 413, 413, 413, 413, + 413, 413, 616, 637, 638, 639, 637, 637, 637, 637, + 637, 637, 637, 646, 646, 646, 646, 646, 647, 676, + 732, 413, 413, 413, 413, 413, 413, 502, 503, 504, + + 502, 502, 502, 502, 502, 502, 502, 587, 587, 587, + 587, 587, 587, 587, 587, 587, 587, 576, 576, 641, + 641, 641, 641, 641, 641, 226, 829, 830, 781, 578, + 578, 692, 105, 789, 105, 431, 448, 432, 432, 432, + 432, 432, 432, 432, 432, 432, 432, 431, 734, 432, + 432, 432, 432, 432, 432, 432, 432, 432, 432, 509, + 510, 511, 509, 509, 509, 509, 509, 509, 509, 512, + 105, 682, 105, 513, 513, 513, 513, 513, 513, 645, + 645, 645, 645, 645, 645, 645, 645, 645, 645, 824, + 824, 824, 824, 682, 226, 682, 682, 780, 513, 513, + + 513, 513, 513, 513, 514, 523, 517, 517, 517, 517, + 517, 518, 515, 515, 515, 515, 369, 226, 521, 521, + 521, 521, 521, 521, 521, 521, 521, 521, 448, 369, + 226, 724, 520, 520, 520, 520, 520, 520, 369, 226, + 576, 523, 861, 226, 664, 664, 664, 664, 664, 665, + 595, 131, 643, 861, 595, 725, 226, 520, 520, 520, + 520, 520, 520, 369, 226, 522, 522, 522, 522, 522, + 522, 522, 522, 522, 522, 523, 336, 861, 336, 524, + 524, 524, 524, 524, 524, 369, 226, 660, 660, 660, + 660, 660, 660, 829, 830, 751, 226, 595, 710, 710, + + 710, 710, 710, 711, 524, 524, 524, 524, 524, 524, + 226, 528, 529, 530, 528, 528, 528, 528, 528, 528, + 528, 531, 682, 226, 861, 532, 532, 532, 532, 532, + 532, 663, 663, 663, 663, 663, 663, 663, 663, 663, + 663, 175, 175, 175, 682, 861, 682, 683, 861, 861, + 532, 532, 532, 532, 532, 532, 861, 643, 524, 524, + 524, 524, 524, 524, 524, 524, 524, 524, 104, 533, + 750, 105, 111, 861, 104, 111, 219, 104, 104, 219, + 104, 104, 104, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 534, 749, 643, 104, 131, 131, 131, + + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 105, 131, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 569, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 684, 685, 686, 687, 684, 684, 684, 684, 684, 684, + 619, 620, 620, 620, 620, 620, 620, 694, 694, 694, + 694, 694, 694, 694, 694, 694, 694, 105, 576, 576, + 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, + 578, 643, 620, 620, 579, 579, 579, 579, 579, 579, + + 695, 695, 695, 695, 695, 696, 697, 697, 697, 697, + 653, 578, 654, 654, 654, 654, 654, 654, 698, 579, + 579, 579, 579, 579, 579, 583, 584, 585, 583, 583, + 583, 583, 583, 583, 583, 586, 698, 724, 776, 587, + 587, 587, 587, 587, 587, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 743, 698, 748, 748, 748, + 226, 725, 777, 743, 587, 587, 587, 587, 587, 587, + 861, 523, 579, 579, 579, 579, 579, 579, 579, 579, + 579, 579, 369, 226, 593, 593, 593, 593, 593, 593, + 593, 593, 593, 593, 523, 776, 621, 621, 592, 592, + + 592, 592, 592, 592, 576, 576, 705, 705, 705, 705, + 705, 705, 175, 175, 175, 743, 643, 707, 736, 777, + 737, 738, 739, 592, 592, 592, 592, 592, 592, 369, + 226, 594, 594, 594, 594, 594, 594, 594, 594, 594, + 594, 595, 131, 620, 620, 596, 596, 596, 596, 596, + 596, 709, 709, 709, 709, 709, 709, 709, 709, 709, + 709, 369, 226, 722, 722, 722, 722, 722, 722, 740, + 596, 596, 596, 596, 596, 596, 226, 600, 601, 602, + 600, 600, 600, 600, 600, 600, 600, 776, 729, 807, + 861, 603, 603, 603, 603, 603, 603, 717, 718, 719, + + 717, 717, 717, 717, 717, 717, 717, 337, 482, 337, + 482, 777, 226, 808, 861, 807, 603, 603, 603, 603, + 603, 603, 861, 595, 596, 596, 596, 596, 596, 596, + 596, 596, 596, 596, 104, 787, 131, 771, 771, 808, + 104, 735, 735, 104, 104, 735, 104, 104, 104, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 735, + 735, 735, 104, 131, 131, 131, 131, 131, 131, 131, + 131, 604, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 105, 131, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + + 104, 104, 104, 104, 104, 619, 622, 622, 622, 622, + 622, 623, 620, 620, 620, 620, 193, 772, 772, 861, + 193, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 707, 193, 653, 807, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 626, 204, 204, 808, 206, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 632, 633, 634, + 635, 632, 632, 632, 632, 632, 632, 369, 226, 736, + 653, 737, 738, 739, 483, 515, 483, 515, 576, 595, + + 755, 756, 757, 755, 755, 755, 755, 755, 755, 755, + 707, 653, 578, 834, 105, 569, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 698, 826, 699, 699, + 699, 699, 699, 699, 765, 765, 765, 765, 765, 766, + 742, 716, 716, 716, 716, 716, 716, 716, 716, 716, + 716, 827, 105, 105, 576, 698, 641, 641, 641, 641, + 641, 641, 641, 641, 641, 641, 578, 576, 576, 642, + 642, 642, 642, 642, 642, 642, 642, 642, 642, 643, + 762, 861, 826, 644, 644, 644, 644, 644, 644, 576, + 698, 760, 760, 760, 760, 760, 760, 516, 508, 516, + + 861, 707, 861, 861, 861, 861, 827, 691, 644, 644, + 644, 644, 644, 644, 648, 649, 650, 648, 648, 648, + 648, 648, 648, 648, 651, 690, 689, 788, 652, 652, + 652, 652, 652, 652, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 482, 515, 482, 515, 654, 226, + 654, 740, 688, 652, 652, 652, 652, 652, 652, 861, + 595, 644, 644, 644, 644, 644, 644, 644, 644, 644, + 644, 653, 619, 656, 656, 656, 656, 656, 657, 654, + 654, 654, 654, 369, 226, 660, 660, 660, 660, 660, + 660, 660, 660, 660, 660, 595, 619, 861, 826, 659, + + 659, 659, 659, 659, 659, 736, 619, 737, 738, 739, + 861, 861, 737, 738, 739, 861, 105, 861, 861, 739, + 678, 861, 827, 762, 659, 659, 659, 659, 659, 659, + 369, 226, 661, 661, 661, 661, 661, 661, 661, 661, + 661, 661, 816, 576, 677, 131, 662, 662, 662, 662, + 662, 662, 655, 105, 655, 762, 740, 699, 700, 699, + 700, 740, 654, 744, 654, 744, 740, 745, 699, 745, + 699, 662, 662, 662, 662, 662, 662, 861, 226, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, 104, + 741, 653, 741, 741, 741, 104, 741, 741, 104, 104, + + 741, 104, 104, 104, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 741, 741, 741, 104, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 666, 131, 131, + 131, 105, 131, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 669, 743, 653, 744, 744, 744, 744, 744, 744, 193, + 795, 508, 795, 193, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 670, 193, 367, 631, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 628, 206, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 692, 627, 693, 693, 693, 693, 693, 693, 693, 693, + 693, 693, 784, 785, 786, 784, 784, 784, 784, 784, + 784, 784, 770, 770, 770, 770, 770, 770, 770, 770, + 770, 770, 805, 805, 805, 805, 805, 806, 783, 105, + 698, 783, 701, 701, 701, 701, 701, 702, 699, 699, + 699, 699, 576, 625, 705, 705, 705, 705, 705, 705, + 705, 705, 705, 705, 643, 576, 624, 706, 706, 706, + + 706, 706, 706, 706, 706, 706, 706, 707, 796, 619, + 796, 708, 708, 708, 708, 708, 708, 576, 619, 801, + 801, 801, 801, 801, 801, 812, 614, 812, 794, 762, + 795, 795, 795, 795, 795, 795, 708, 708, 708, 708, + 708, 708, 712, 713, 714, 712, 712, 712, 712, 712, + 712, 712, 715, 813, 613, 813, 716, 716, 716, 716, + 716, 716, 804, 804, 804, 804, 804, 804, 804, 804, + 804, 804, 226, 771, 771, 771, 771, 771, 771, 514, + 514, 716, 716, 716, 716, 716, 716, 861, 514, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 369, + + 226, 722, 722, 722, 722, 722, 722, 722, 722, 722, + 722, 743, 508, 746, 746, 746, 746, 746, 747, 748, + 748, 748, 748, 752, 753, 754, 752, 752, 752, 752, + 752, 752, 752, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 839, 839, 839, 839, 839, 839, 367, + 105, 692, 295, 693, 693, 693, 693, 693, 693, 693, + 693, 693, 693, 845, 568, 845, 789, 567, 790, 790, + 790, 790, 790, 790, 820, 821, 822, 820, 820, 820, + 820, 820, 820, 820, 858, 858, 858, 858, 858, 858, + + 105, 576, 566, 760, 760, 760, 760, 760, 760, 760, + 760, 760, 760, 707, 576, 105, 761, 761, 761, 761, + 761, 761, 761, 761, 761, 761, 762, 846, 563, 846, + 763, 763, 763, 763, 763, 763, 831, 832, 833, 831, + 831, 831, 831, 831, 831, 831, 811, 562, 812, 812, + 812, 812, 812, 812, 561, 763, 763, 763, 763, 763, + 763, 767, 768, 769, 767, 767, 767, 767, 767, 767, + 767, 481, 481, 481, 553, 770, 770, 770, 770, 770, + 770, 839, 839, 839, 839, 839, 839, 839, 839, 839, + 839, 834, 552, 835, 835, 835, 835, 835, 835, 105, + + 770, 770, 770, 770, 770, 770, 861, 105, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, 226, 773, + 773, 773, 773, 773, 774, 771, 771, 771, 771, 789, + 105, 790, 790, 790, 790, 790, 790, 790, 790, 790, + 790, 789, 105, 791, 791, 791, 791, 791, 791, 791, + 791, 791, 791, 789, 105, 792, 792, 792, 792, 792, + 793, 790, 790, 790, 790, 794, 514, 797, 797, 797, + 797, 797, 798, 795, 795, 795, 795, 576, 514, 801, + 801, 801, 801, 801, 801, 801, 801, 801, 801, 762, + 576, 508, 802, 802, 802, 802, 802, 802, 802, 802, + + 802, 802, 367, 295, 295, 501, 803, 803, 803, 803, + 803, 803, 840, 840, 840, 840, 840, 840, 840, 840, + 840, 840, 844, 500, 845, 845, 845, 845, 845, 845, + 499, 803, 803, 803, 803, 803, 803, 861, 498, 803, + 803, 803, 803, 803, 803, 803, 803, 803, 803, 811, + 497, 814, 814, 814, 814, 814, 815, 812, 812, 812, + 812, 104, 496, 817, 818, 819, 817, 817, 817, 817, + 817, 817, 817, 789, 495, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 789, 494, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 576, 493, 825, + + 825, 825, 825, 825, 825, 825, 825, 825, 825, 834, + 492, 835, 835, 835, 835, 835, 835, 835, 835, 835, + 835, 834, 491, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 834, 490, 837, 837, 837, 837, 837, + 838, 835, 835, 835, 835, 841, 841, 841, 841, 841, + 842, 839, 839, 839, 839, 844, 489, 847, 847, 847, + 847, 847, 848, 845, 845, 845, 845, 104, 488, 849, + 850, 851, 849, 849, 849, 849, 849, 849, 849, 834, + 487, 835, 835, 835, 835, 835, 835, 835, 835, 835, + 835, 834, 486, 835, 835, 835, 835, 835, 835, 835, + + 835, 835, 835, 839, 839, 839, 839, 839, 839, 839, + 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, + 839, 839, 839, 852, 853, 854, 852, 852, 852, 852, + 852, 852, 852, 855, 855, 855, 855, 855, 855, 855, + 855, 855, 855, 858, 858, 858, 858, 858, 858, 858, + 858, 858, 858, 852, 852, 852, 852, 852, 852, 852, + 852, 852, 852, 855, 855, 855, 855, 855, 855, 861, + 105, 849, 849, 849, 849, 849, 849, 849, 849, 849, + 849, 859, 859, 859, 859, 859, 860, 858, 858, 858, + 858, 843, 481, 481, 843, 403, 476, 475, 843, 469, + + 105, 468, 467, 466, 465, 464, 463, 462, 105, 856, + 856, 856, 856, 856, 857, 855, 855, 855, 855, 858, + 858, 858, 858, 858, 858, 858, 858, 858, 858, 461, + 460, 459, 458, 440, 367, 295, 436, 295, 129, 430, + 429, 428, 425, 424, 423, 422, 105, 855, 855, 855, + 855, 855, 855, 855, 855, 855, 855, 421, 420, 419, + 418, 415, 335, 335, 335, 403, 405, 403, 404, 403, + 397, 396, 395, 394, 393, 392, 391, 390, 389, 384, + 383, 123, 295, 367, 105, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + + 63, 63, 63, 63, 63, 63, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - - 78, 78, 78, 78, 78, 78, 78, 102, 115, 214, - 107, 105, 104, 103, 102, 209, 102, 102, 102, 102, - 208, 207, 102, 102, 102, 102, 102, 102, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 110, - 206, 205, 201, 180, 110, 174, 110, 166, 110, 110, - 110, 110, 110, 136, 110, 110, 110, 110, 110, 110, - 114, 133, 160, 159, 156, 154, 140, 114, 139, 114, - 114, 114, 114, 138, 135, 114, 114, 114, 114, 114, - 114, 116, 134, 129, 116, 116, 127, 116, 116, 115, - - 116, 116, 116, 116, 105, 104, 116, 116, 116, 116, - 116, 116, 126, 126, 103, 126, 833, 833, 833, 126, - 161, 833, 833, 161, 161, 833, 161, 161, 833, 161, - 161, 161, 161, 833, 833, 161, 161, 161, 161, 161, - 161, 165, 833, 833, 165, 165, 833, 165, 165, 833, - 165, 165, 165, 165, 833, 165, 165, 165, 833, 165, - 165, 165, 173, 833, 833, 173, 833, 833, 173, 173, - 833, 173, 173, 173, 173, 173, 833, 173, 173, 173, - 173, 173, 173, 177, 177, 177, 177, 177, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - - 177, 177, 177, 177, 179, 179, 833, 179, 833, 179, - 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, - 179, 179, 179, 179, 179, 185, 833, 833, 833, 833, - 185, 833, 185, 833, 185, 185, 185, 185, 185, 833, - 185, 185, 185, 185, 185, 185, 189, 833, 833, 833, - 833, 833, 833, 189, 833, 189, 189, 189, 189, 833, - 189, 189, 189, 189, 189, 189, 189, 192, 833, 833, - 192, 192, 833, 192, 192, 833, 192, 192, 192, 192, - 833, 192, 192, 192, 192, 192, 192, 192, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, - - 212, 212, 212, 212, 212, 212, 212, 212, 212, 213, - 213, 833, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 117, 833, 833, 117, 117, 833, 117, 117, 833, 117, - 117, 117, 117, 833, 833, 117, 117, 117, 117, 117, - 117, 126, 126, 833, 126, 833, 833, 833, 126, 221, - 221, 833, 221, 833, 833, 833, 221, 223, 223, 223, - 833, 223, 833, 833, 833, 223, 161, 833, 833, 161, - 161, 833, 161, 161, 833, 161, 161, 161, 161, 833, - 833, 161, 161, 161, 161, 161, 161, 162, 833, 833, - - 162, 162, 833, 162, 162, 833, 162, 162, 162, 162, - 833, 833, 162, 162, 162, 162, 162, 162, 165, 833, - 833, 165, 165, 833, 165, 165, 833, 165, 165, 165, - 165, 833, 165, 165, 165, 833, 165, 165, 165, 173, - 833, 833, 173, 833, 833, 173, 173, 833, 173, 173, - 173, 173, 173, 833, 173, 173, 173, 173, 173, 173, - 188, 833, 833, 833, 833, 833, 833, 188, 833, 188, - 188, 188, 188, 833, 833, 188, 188, 188, 188, 188, - 188, 189, 833, 833, 833, 833, 833, 833, 189, 833, - 189, 189, 189, 189, 833, 189, 189, 189, 189, 189, - - 189, 189, 192, 833, 833, 192, 192, 833, 192, 192, - 833, 192, 192, 192, 192, 833, 192, 192, 192, 192, - 192, 192, 192, 203, 833, 833, 203, 203, 833, 203, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 283, 283, 833, 283, 833, 833, 833, 283, 289, - 289, 289, 833, 289, 833, 833, 833, 289, 349, 349, - 833, 349, 833, 833, 833, 349, 350, 350, 833, 350, - 833, 833, 833, 350, 354, 354, 833, 354, 833, 833, - 833, 354, 356, 356, 356, 833, 356, 833, 833, 833, - - 356, 203, 833, 833, 203, 203, 833, 203, 420, 420, - 833, 420, 833, 833, 833, 420, 422, 422, 833, 422, - 833, 833, 833, 422, 423, 423, 833, 423, 833, 833, - 833, 423, 425, 425, 425, 833, 425, 833, 833, 833, - 425, 429, 429, 429, 429, 833, 429, 833, 833, 833, - 429, 485, 485, 833, 485, 833, 833, 833, 485, 486, - 486, 833, 486, 833, 833, 833, 486, 487, 487, 833, - 487, 833, 833, 833, 487, 499, 499, 499, 833, 499, - 833, 833, 833, 499, 500, 500, 500, 500, 833, 500, - 833, 833, 833, 500, 212, 212, 212, 212, 212, 212, - - 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, - 212, 212, 212, 212, 212, 550, 550, 833, 550, 833, - 833, 833, 550, 551, 551, 833, 551, 833, 833, 833, - 551, 567, 567, 567, 833, 567, 833, 833, 833, 567, - 568, 568, 568, 568, 833, 568, 833, 833, 833, 568, - 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, - 212, 203, 833, 833, 203, 203, 833, 203, 190, 833, - 833, 833, 190, 190, 833, 190, 190, 190, 833, 833, - 190, 190, 610, 610, 833, 610, 833, 833, 833, 610, - - 614, 833, 614, 614, 833, 614, 833, 833, 833, 614, - 632, 632, 632, 833, 632, 833, 833, 833, 632, 633, - 633, 633, 633, 833, 633, 833, 833, 833, 633, 579, - 579, 833, 833, 579, 833, 833, 833, 579, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 212, 212, 203, - 833, 833, 203, 203, 833, 203, 190, 833, 833, 833, - 190, 190, 833, 190, 190, 190, 833, 833, 190, 190, - 675, 675, 833, 675, 833, 833, 833, 675, 676, 833, - 676, 676, 833, 676, 833, 833, 833, 676, 692, 692, - - 692, 833, 692, 833, 833, 833, 692, 693, 693, 693, - 833, 833, 693, 833, 833, 833, 693, 702, 702, 702, - 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, - 702, 702, 702, 702, 702, 702, 702, 702, 707, 707, - 833, 707, 707, 707, 833, 707, 833, 707, 707, 707, - 707, 833, 833, 707, 707, 707, 707, 707, 707, 713, - 713, 833, 713, 713, 713, 833, 713, 833, 713, 713, - 713, 713, 833, 833, 713, 713, 713, 713, 713, 713, - 203, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 203, 203, 833, 203, 203, 833, 203, 730, 730, - - 833, 730, 833, 833, 833, 730, 731, 833, 731, 731, - 833, 731, 833, 833, 833, 731, 747, 747, 833, 833, - 747, 833, 833, 833, 747, 713, 833, 833, 833, 833, - 833, 833, 713, 833, 713, 713, 713, 713, 833, 833, - 713, 713, 713, 713, 713, 713, 771, 771, 833, 771, - 833, 833, 833, 771, 772, 833, 772, 772, 833, 772, - 833, 833, 833, 772, 795, 795, 833, 795, 833, 833, - 833, 795, 796, 833, 796, 833, 833, 796, 833, 833, - 833, 796, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - - 800, 800, 800, 15, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833 + 33, 33, 33, 33, 33, 33, 33, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 104, + 295, 129, 109, 357, 353, 352, 104, 351, 104, 104, + 104, 104, 350, 349, 104, 104, 104, 104, 104, 104, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 112, 348, 347, 346, 345, 112, 344, 112, 343, + 112, 112, 112, 112, 112, 342, 112, 112, 112, 112, + 112, 112, 116, 197, 335, 335, 262, 332, 329, 116, + 328, 116, 116, 116, 116, 327, 326, 116, 116, 116, + 116, 116, 116, 118, 325, 320, 118, 118, 319, 118, + 118, 318, 118, 118, 118, 118, 317, 316, 118, 118, + 118, 118, 118, 118, 128, 128, 315, 128, 314, 313, + 312, 128, 164, 311, 310, 164, 164, 309, 164, 164, + 308, 164, 164, 164, 164, 307, 306, 164, 164, 164, + + 164, 164, 164, 168, 305, 129, 168, 168, 121, 168, + 168, 109, 168, 168, 168, 168, 109, 168, 168, 168, + 283, 168, 168, 168, 176, 282, 281, 176, 280, 273, + 176, 176, 272, 176, 176, 176, 176, 176, 271, 176, + 176, 176, 176, 176, 176, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 182, 182, 270, 182, + 269, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 188, 861, 194, + 262, 182, 188, 183, 188, 177, 188, 188, 188, 188, + + 188, 177, 188, 188, 188, 188, 188, 188, 192, 169, + 260, 163, 163, 253, 252, 192, 251, 192, 192, 192, + 192, 250, 192, 192, 192, 192, 192, 192, 192, 195, + 249, 246, 195, 195, 245, 195, 195, 244, 195, 195, + 195, 195, 243, 195, 195, 195, 195, 195, 195, 195, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 217, 217, 242, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 119, 235, 234, 119, 119, 233, 119, 119, + + 232, 119, 119, 119, 119, 231, 230, 119, 119, 119, + 119, 119, 119, 128, 128, 129, 128, 104, 129, 196, + 128, 225, 225, 117, 225, 218, 109, 107, 225, 227, + 227, 227, 106, 227, 105, 213, 212, 227, 164, 211, + 210, 164, 164, 209, 164, 164, 204, 164, 164, 164, + 164, 183, 177, 164, 164, 164, 164, 164, 164, 165, + 169, 139, 165, 165, 136, 165, 165, 163, 165, 165, + 165, 165, 162, 159, 165, 165, 165, 165, 165, 165, + 168, 157, 143, 168, 168, 142, 168, 168, 141, 168, + 168, 168, 168, 138, 168, 168, 168, 137, 168, 168, + + 168, 176, 131, 129, 176, 117, 107, 176, 176, 106, + 176, 176, 176, 176, 176, 105, 176, 176, 176, 176, + 176, 176, 182, 182, 861, 182, 861, 182, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 191, 861, 861, 861, 861, 861, 861, + 191, 861, 191, 191, 191, 191, 861, 861, 191, 191, + 191, 191, 191, 191, 192, 861, 861, 861, 861, 861, + 861, 192, 861, 192, 192, 192, 192, 861, 192, 192, + 192, 192, 192, 192, 192, 195, 861, 861, 195, 195, + 861, 195, 195, 861, 195, 195, 195, 195, 861, 195, + + 195, 195, 195, 195, 195, 195, 206, 861, 861, 206, + 206, 861, 206, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 291, 291, 861, 291, 861, 861, + 861, 291, 297, 297, 297, 861, 297, 861, 861, 861, + 297, 361, 361, 861, 361, 861, 861, 861, 361, 362, + 362, 861, 362, 861, 861, 861, 362, 366, 366, 861, + 366, 861, 861, 861, 366, 368, 368, 368, 861, 368, + 861, 861, 861, 368, 206, 861, 861, 206, 206, 861, + 206, 436, 436, 861, 436, 861, 861, 861, 436, 438, + + 438, 861, 438, 861, 861, 861, 438, 439, 439, 861, + 439, 861, 861, 861, 439, 441, 441, 441, 861, 441, + 861, 861, 861, 441, 445, 445, 445, 445, 861, 445, + 861, 861, 861, 445, 505, 505, 861, 505, 861, 861, + 861, 505, 506, 506, 861, 506, 861, 861, 861, 506, + 507, 507, 861, 507, 861, 861, 861, 507, 519, 519, + 519, 861, 519, 861, 861, 861, 519, 520, 520, 520, + 520, 861, 520, 861, 861, 861, 520, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 574, 574, + + 861, 574, 861, 861, 861, 574, 575, 575, 861, 575, + 861, 861, 861, 575, 591, 591, 591, 861, 591, 861, + 861, 861, 591, 592, 592, 592, 592, 861, 592, 861, + 861, 861, 592, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 206, 861, 861, 206, 206, 861, + 206, 193, 861, 861, 861, 193, 193, 861, 193, 193, + 193, 861, 861, 193, 193, 636, 636, 861, 636, 861, + 861, 861, 636, 640, 861, 640, 640, 861, 640, 861, + 861, 861, 640, 658, 658, 658, 861, 658, 861, 861, + + 861, 658, 659, 659, 659, 659, 861, 659, 861, 861, + 861, 659, 603, 603, 861, 861, 603, 861, 861, 861, + 603, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 206, 861, 861, 206, 206, 861, 206, 193, + 861, 861, 861, 193, 193, 861, 193, 193, 193, 861, + 861, 193, 193, 703, 703, 861, 703, 861, 861, 861, + 703, 704, 861, 704, 704, 861, 704, 861, 861, 861, + 704, 720, 720, 720, 861, 720, 861, 861, 861, 720, + 721, 721, 721, 861, 861, 721, 861, 861, 861, 721, + + 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, + 730, 735, 735, 861, 735, 735, 735, 861, 735, 861, + 735, 735, 735, 735, 861, 861, 735, 735, 735, 735, + 735, 735, 741, 741, 861, 741, 741, 741, 861, 741, + 861, 741, 741, 741, 741, 861, 861, 741, 741, 741, + 741, 741, 741, 206, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 206, 206, 861, 206, 206, 861, + 206, 758, 758, 861, 758, 861, 861, 861, 758, 759, + 861, 759, 759, 861, 759, 861, 861, 861, 759, 775, + + 775, 861, 861, 775, 861, 861, 861, 775, 741, 861, + 861, 861, 861, 861, 861, 741, 861, 741, 741, 741, + 741, 861, 861, 741, 741, 741, 741, 741, 741, 799, + 799, 861, 799, 861, 861, 861, 799, 800, 861, 800, + 800, 861, 800, 861, 861, 861, 800, 823, 823, 861, + 823, 861, 861, 861, 823, 824, 861, 824, 861, 861, + 824, 861, 861, 861, 824, 828, 828, 828, 828, 828, + 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, + 828, 828, 828, 828, 828, 828, 15, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861 } ; -static yyconst short int yy_chk[5675] = +static yyconst short int yy_chk[5659] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1300,623 +1308,621 @@ static yyconst short int yy_chk[5675] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 553, 3, 38, 2, 53, 3, 50, 38, 51, - 4, 36, 3, 553, 4, 3, 11, 11, 11, 11, - 4, 22, 36, 4, 41, 5, 5, 5, 51, 5, - - 2, 2, 50, 53, 2, 5, 69, 69, 41, 3, - 827, 22, 2, 3, 3, 2, 3, 4, 55, 5, - 5, 4, 4, 151, 4, 6, 6, 6, 55, 6, - 819, 12, 12, 12, 12, 6, 11, 22, 3, 77, - 77, 73, 47, 27, 27, 5, 4, 27, 27, 6, - 6, 47, 48, 79, 9, 9, 9, 9, 9, 75, - 47, 167, 167, 9, 9, 9, 73, 27, 30, 30, - 30, 30, 30, 30, 80, 6, 7, 7, 7, 9, - 7, 12, 48, 48, 75, 151, 48, 61, 144, 82, - 82, 27, 82, 144, 48, 92, 61, 48, 10, 10, - - 10, 10, 10, 79, 9, 61, 92, 10, 10, 10, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 164, 818, 80, 10, 182, 164, 7, 7, 7, 7, + 1, 2, 51, 3, 80, 2, 36, 3, 42, 37, + 54, 4, 37, 3, 52, 4, 3, 36, 5, 5, + 5, 4, 5, 42, 4, 56, 74, 51, 5, 39, + + 22, 2, 2, 52, 39, 56, 2, 855, 54, 70, + 70, 3, 5, 5, 2, 3, 3, 2, 3, 4, + 22, 93, 74, 4, 4, 80, 4, 6, 6, 6, + 76, 6, 93, 11, 11, 11, 11, 6, 81, 5, + 3, 12, 12, 12, 12, 27, 27, 22, 4, 27, + 27, 6, 6, 78, 78, 103, 76, 9, 9, 9, + 9, 9, 83, 83, 103, 83, 9, 9, 9, 27, + 30, 30, 30, 30, 30, 30, 84, 48, 6, 7, + 7, 7, 9, 7, 11, 155, 48, 81, 62, 129, + 94, 157, 12, 94, 27, 48, 84, 62, 155, 322, + + 129, 10, 10, 10, 10, 10, 62, 157, 9, 112, + 10, 10, 10, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 84, 49, 146, 10, 146, 322, 112, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 8, 8, 8, 10, 8, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 88, 88, 88, 88, 88, 88, 101, 103, 282, 103, - 103, 103, 182, 103, 103, 101, 152, 103, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 143, 152, - 143, 103, 103, 103, 282, 8, 8, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, + 8, 8, 10, 8, 49, 49, 112, 847, 160, 49, + 89, 89, 89, 89, 89, 89, 354, 49, 160, 354, + 49, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 127, 127, 127, 127, 127, 127, 170, 170, 846, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 13, 13, 13, 13, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 21, 127, 156, 817, 83, 171, - 171, 278, 156, 181, 21, 804, 127, 21, 21, 21, - - 21, 21, 21, 21, 21, 21, 21, 28, 83, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 155, 183, 183, 28, 28, 28, 28, 28, 154, 278, - 297, 58, 58, 155, 83, 58, 58, 125, 125, 125, - 125, 125, 125, 181, 154, 28, 157, 28, 28, 28, - 28, 28, 28, 34, 297, 58, 157, 518, 252, 34, - 252, 518, 34, 34, 323, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 58, - 323, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 21, 147, 144, 144, 174, 174, 147, 167, 156, 154, + + 21, 158, 167, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 28, 158, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 186, 186, 286, 28, + 28, 28, 28, 28, 28, 323, 184, 59, 59, 138, + 138, 59, 59, 144, 156, 138, 138, 159, 257, 138, + 248, 138, 28, 159, 28, 28, 28, 28, 28, 28, + 34, 59, 154, 255, 248, 257, 34, 286, 255, 34, + 34, 323, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 59, 184, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 223, 803, 248, 37, 37, 37, - 37, 37, 251, 153, 242, 223, 37, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 253, 242, 251, - 313, 37, 37, 37, 37, 37, 37, 45, 45, 45, - 45, 45, 253, 45, 45, 321, 321, 45, 123, 123, - 123, 123, 123, 123, 123, 123, 123, 123, 153, 248, - 110, 45, 45, 45, 46, 313, 46, 46, 46, 46, - - 46, 46, 46, 46, 46, 46, 49, 67, 67, 67, - 110, 67, 314, 112, 800, 67, 49, 67, 314, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 135, - 255, 67, 67, 112, 135, 135, 110, 289, 135, 174, - 135, 84, 174, 174, 255, 141, 141, 84, 289, 174, - 84, 116, 116, 84, 84, 116, 116, 67, 185, 112, - 443, 443, 178, 178, 174, 49, 68, 84, 249, 84, - 186, 241, 241, 249, 241, 116, 68, 384, 185, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 300, - 186, 299, 84, 84, 85, 141, 299, 85, 85, 116, - - 85, 85, 85, 85, 185, 241, 85, 85, 113, 384, - 113, 113, 178, 300, 113, 113, 186, 797, 113, 385, - 85, 85, 85, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 113, 113, 159, 159, 159, 159, 159, - 159, 159, 159, 159, 159, 85, 85, 86, 320, 385, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 332, 334, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 332, 334, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - - 86, 86, 86, 86, 86, 86, 86, 89, 320, 89, - 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, - 286, 286, 286, 89, 89, 89, 89, 89, 274, 274, - 115, 274, 115, 115, 115, 342, 115, 115, 342, 386, - 115, 199, 199, 199, 199, 199, 199, 89, 89, 89, - 89, 89, 89, 90, 115, 115, 115, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 369, 386, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 369, 90, 90, 90, 90, 90, - - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 392, 374, 324, 93, 93, 93, - 93, 93, 324, 356, 161, 161, 93, 207, 161, 161, - 333, 795, 207, 207, 356, 333, 207, 145, 207, 374, - 470, 93, 93, 93, 93, 93, 93, 99, 161, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 118, - 456, 118, 118, 118, 470, 118, 118, 145, 145, 118, - 456, 145, 161, 218, 218, 218, 218, 218, 218, 145, - 312, 392, 145, 118, 118, 118, 119, 119, 119, 119, - - 119, 119, 119, 119, 119, 119, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 358, 358, 312, 163, - 394, 163, 163, 163, 393, 163, 163, 786, 358, 163, - 416, 394, 119, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 163, 163, 163, 393, 120, 120, 120, - 120, 120, 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 281, 281, 281, 281, 472, 444, 416, 444, - 785, 120, 120, 120, 120, 120, 120, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 322, 475, - 472, 128, 128, 128, 128, 128, 197, 197, 197, 197, - - 197, 197, 197, 197, 197, 197, 293, 293, 293, 293, - 293, 293, 784, 475, 322, 128, 128, 128, 128, 128, - 128, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 129, 322, 546, 387, 129, 129, 129, 129, 129, - 187, 311, 187, 187, 311, 189, 187, 187, 388, 449, - 187, 189, 449, 388, 189, 360, 360, 189, 189, 129, - 129, 129, 129, 129, 129, 187, 187, 360, 387, 462, - 546, 189, 425, 189, 191, 311, 191, 191, 191, 462, - 191, 191, 775, 425, 191, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 429, 189, 189, 191, 191, - - 191, 192, 774, 461, 192, 192, 429, 192, 192, 192, - 192, 193, 395, 192, 192, 193, 533, 395, 430, 430, - 461, 193, 431, 431, 445, 447, 446, 192, 192, 192, - 430, 446, 533, 446, 431, 193, 193, 214, 214, 214, - 214, 214, 214, 214, 214, 214, 214, 459, 445, 447, - 543, 772, 192, 192, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 771, 543, 445, 447, 195, 195, - 195, 195, 195, 215, 215, 215, 215, 215, 215, 215, - 215, 215, 215, 329, 531, 329, 329, 329, 329, 329, - 329, 476, 195, 195, 195, 195, 195, 195, 200, 528, - - 769, 459, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 476, 528, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 531, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201, 581, - 516, 581, 201, 201, 201, 201, 201, 217, 217, 217, - 217, 217, 217, 217, 217, 217, 217, 366, 366, 366, - 366, 366, 366, 450, 516, 451, 201, 201, 201, 201, - - 201, 201, 216, 768, 216, 216, 216, 216, 216, 216, - 216, 216, 216, 216, 254, 448, 471, 450, 254, 451, - 448, 471, 582, 582, 254, 290, 290, 290, 290, 290, - 290, 290, 290, 290, 290, 450, 767, 451, 254, 254, - 216, 219, 460, 219, 219, 219, 219, 219, 219, 219, - 219, 219, 219, 460, 520, 524, 526, 219, 219, 219, - 219, 219, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 439, 439, 439, 439, 439, 439, 520, 524, - 526, 219, 219, 219, 219, 219, 219, 222, 222, 222, - 222, 222, 222, 222, 222, 222, 222, 222, 635, 635, - - 534, 222, 222, 222, 222, 222, 325, 325, 325, 325, - 325, 325, 325, 325, 325, 325, 467, 534, 467, 467, - 467, 467, 467, 467, 757, 222, 222, 222, 222, 222, - 222, 224, 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 584, 604, 584, 224, 224, 224, 224, - 224, 357, 357, 357, 357, 357, 357, 357, 357, 357, - 357, 484, 484, 484, 484, 484, 484, 591, 604, 591, - 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 585, 636, 636, - 225, 225, 225, 225, 225, 359, 359, 359, 359, 359, - - 359, 359, 359, 359, 359, 491, 491, 491, 491, 491, - 491, 585, 643, 643, 225, 225, 225, 225, 225, 225, - 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, - 226, 651, 651, 585, 226, 226, 226, 226, 226, 363, - 363, 363, 363, 363, 363, 363, 363, 609, 609, 609, - 419, 363, 419, 419, 419, 419, 419, 419, 226, 226, - 226, 226, 226, 226, 259, 756, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 260, 260, 260, 260, - 260, 260, 260, 260, 260, 260, 260, 642, 419, 642, - 260, 260, 260, 260, 260, 365, 365, 365, 365, 365, - - 365, 365, 365, 365, 365, 498, 747, 498, 498, 498, - 498, 498, 498, 745, 260, 260, 260, 260, 260, 260, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 549, 549, 549, 549, 262, 262, 262, 262, 262, 432, - 432, 432, 432, 432, 432, 432, 432, 432, 432, 510, - 510, 510, 510, 510, 510, 694, 694, 744, 262, 262, - 262, 262, 262, 262, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 433, 433, 436, 436, 436, 436, - 436, 436, 436, 436, 700, 700, 433, 555, 436, 438, - 438, 438, 438, 438, 438, 438, 438, 438, 438, 555, - - 277, 285, 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 703, 703, 645, 291, 291, - 291, 291, 291, 463, 463, 463, 463, 463, 463, 463, - 463, 463, 463, 515, 522, 583, 586, 743, 522, 515, - 583, 645, 291, 291, 291, 291, 291, 291, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 586, 590, 590, 294, 294, 294, 294, 294, 483, 483, - 483, 483, 483, 483, 483, 483, 483, 483, 640, 644, - 731, 640, 586, 499, 644, 753, 753, 294, 294, 294, - - 294, 294, 294, 295, 499, 295, 295, 295, 295, 295, - 295, 295, 295, 295, 295, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 705, 590, 647, 660, 330, - 330, 330, 330, 330, 488, 488, 488, 488, 488, 488, - 488, 488, 488, 488, 561, 561, 561, 561, 561, 561, - 730, 647, 660, 330, 330, 330, 330, 330, 330, 331, - 331, 331, 331, 331, 331, 331, 331, 331, 331, 699, - 650, 699, 653, 331, 331, 331, 331, 331, 490, 490, - 490, 490, 490, 490, 490, 490, 490, 490, 653, 705, - 782, 782, 650, 500, 650, 650, 728, 331, 331, 331, - - 331, 331, 331, 346, 500, 346, 346, 346, 346, 346, - 346, 346, 346, 346, 346, 347, 615, 347, 347, 347, - 347, 347, 347, 347, 347, 347, 347, 348, 615, 348, - 348, 348, 348, 348, 348, 348, 348, 348, 348, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 801, 801, 641, 361, 361, 361, 361, - 361, 494, 494, 494, 494, 494, 494, 494, 494, 494, - 494, 578, 578, 578, 578, 578, 578, 665, 669, 641, - 361, 361, 361, 361, 361, 361, 364, 364, 364, 364, - - 364, 364, 364, 364, 364, 364, 364, 364, 364, 501, - 501, 641, 364, 364, 364, 364, 364, 502, 502, 504, - 504, 501, 514, 519, 523, 665, 669, 902, 902, 502, - 696, 504, 514, 519, 727, 523, 364, 364, 364, 364, - 364, 364, 367, 367, 367, 367, 367, 367, 367, 367, - 367, 367, 367, 367, 696, 720, 661, 367, 367, 367, - 367, 367, 503, 503, 503, 503, 503, 503, 503, 503, - 503, 503, 624, 624, 624, 624, 624, 624, 532, 652, - 661, 367, 367, 367, 367, 367, 367, 368, 532, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 398, - - 661, 398, 398, 398, 398, 398, 398, 398, 398, 398, - 398, 399, 399, 399, 399, 399, 399, 399, 399, 399, - 399, 668, 668, 668, 668, 399, 399, 399, 399, 399, - 507, 507, 507, 507, 507, 507, 507, 507, 652, 903, - 903, 631, 507, 631, 631, 631, 631, 631, 631, 399, - 399, 399, 399, 399, 399, 415, 415, 415, 415, 415, - 415, 415, 415, 415, 415, 509, 509, 509, 509, 509, - 509, 509, 509, 509, 509, 552, 552, 552, 552, 552, - 552, 552, 552, 552, 552, 659, 718, 659, 659, 659, - 717, 415, 417, 616, 417, 417, 417, 417, 417, 417, - - 417, 417, 417, 417, 418, 616, 418, 418, 418, 418, - 418, 418, 418, 418, 418, 418, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 721, 748, 759, - 424, 424, 424, 424, 424, 554, 554, 554, 554, 554, - 554, 554, 554, 554, 554, 751, 844, 751, 762, 844, - 567, 721, 748, 759, 424, 424, 424, 424, 424, 424, - 428, 567, 428, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 434, 434, 434, 434, 434, 434, 434, 434, - 434, 434, 434, 434, 434, 592, 762, 662, 434, 434, - 434, 434, 434, 558, 618, 558, 558, 558, 558, 558, - - 558, 847, 847, 847, 716, 558, 618, 592, 713, 592, - 592, 662, 434, 434, 434, 434, 434, 434, 437, 437, - 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, - 437, 711, 662, 592, 437, 437, 437, 437, 437, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 598, - 598, 598, 598, 598, 598, 598, 807, 706, 437, 437, - 437, 437, 437, 437, 440, 440, 440, 440, 440, 440, - 440, 440, 440, 440, 440, 440, 568, 569, 569, 440, - 440, 440, 440, 440, 570, 570, 632, 568, 633, 569, - 572, 572, 856, 702, 807, 856, 570, 632, 677, 633, - - 698, 750, 572, 440, 440, 440, 440, 440, 440, 441, - 677, 441, 441, 441, 441, 441, 441, 441, 441, 441, - 441, 442, 914, 914, 698, 750, 873, 442, 873, 936, - 442, 442, 936, 442, 442, 442, 442, 442, 442, 442, - 442, 442, 442, 442, 442, 442, 698, 750, 701, 442, - 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, - 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, - 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, - 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, - 442, 482, 482, 482, 482, 482, 482, 482, 482, 482, - - 482, 482, 575, 575, 575, 575, 575, 575, 575, 575, - 864, 864, 864, 678, 575, 577, 577, 577, 577, 577, - 577, 577, 577, 577, 577, 678, 933, 933, 482, 489, - 680, 489, 489, 489, 489, 489, 489, 489, 489, 489, - 489, 489, 680, 695, 722, 489, 489, 489, 489, 489, - 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, - 639, 639, 639, 639, 639, 639, 639, 639, 722, 489, - 489, 489, 489, 489, 489, 492, 492, 492, 492, 492, - 492, 492, 492, 492, 492, 492, 779, 788, 722, 492, - 492, 492, 492, 492, 607, 607, 607, 607, 607, 607, - - 607, 607, 607, 607, 874, 885, 874, 885, 634, 634, - 779, 788, 693, 492, 492, 492, 492, 492, 492, 493, - 634, 493, 493, 493, 493, 493, 493, 493, 493, 493, - 493, 505, 505, 505, 505, 505, 505, 505, 505, 505, - 505, 505, 505, 505, 798, 723, 690, 505, 505, 505, - 505, 505, 608, 608, 608, 608, 608, 608, 608, 608, - 608, 608, 654, 689, 654, 654, 654, 663, 798, 723, - 676, 505, 505, 505, 505, 505, 505, 508, 508, 508, - 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, - 723, 663, 760, 508, 508, 508, 508, 508, 617, 617, - - 617, 617, 617, 617, 617, 617, 617, 617, 663, 934, - 934, 655, 654, 655, 655, 655, 760, 508, 508, 508, - 508, 508, 508, 511, 511, 511, 511, 511, 511, 511, - 511, 511, 511, 511, 675, 781, 760, 673, 511, 511, - 511, 511, 511, 621, 732, 621, 621, 621, 621, 621, - 621, 886, 890, 886, 890, 621, 732, 672, 692, 781, - 671, 655, 511, 511, 511, 511, 511, 511, 512, 692, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 513, 781, 891, 895, 891, 895, 513, 712, 712, 513, - 513, 712, 513, 513, 513, 513, 513, 513, 513, 513, - - 513, 513, 513, 513, 513, 712, 712, 712, 513, 513, - 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, - 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, - 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, - 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 542, 657, 656, 733, 542, 542, 542, 542, 542, - 542, 542, 542, 542, 542, 542, 733, 542, 649, 630, - 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, - 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, - - 542, 542, 629, 542, 542, 542, 542, 542, 542, 542, - 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, - 542, 545, 545, 545, 545, 545, 545, 545, 545, 545, - 545, 623, 623, 623, 623, 623, 623, 623, 623, 623, - 623, 627, 627, 627, 627, 627, 627, 627, 627, 627, - 627, 686, 686, 686, 686, 686, 686, 545, 547, 547, - 547, 547, 547, 547, 547, 547, 547, 547, 547, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 674, - 628, 674, 674, 674, 674, 674, 674, 719, 614, 719, - 719, 719, 719, 719, 719, 547, 556, 735, 556, 556, - - 556, 556, 556, 556, 556, 556, 556, 556, 556, 735, - 612, 611, 556, 556, 556, 556, 556, 679, 679, 679, - 679, 679, 679, 679, 679, 679, 679, 707, 610, 707, - 707, 707, 898, 908, 898, 908, 556, 556, 556, 556, - 556, 556, 559, 773, 559, 559, 559, 559, 559, 559, - 559, 559, 559, 559, 559, 773, 602, 601, 559, 559, - 559, 559, 559, 683, 600, 683, 683, 683, 683, 683, - 683, 909, 917, 909, 917, 683, 918, 707, 918, 921, - 599, 921, 559, 559, 559, 559, 559, 559, 562, 562, - 562, 562, 562, 562, 562, 562, 562, 562, 562, 927, - - 597, 927, 562, 562, 562, 562, 562, 685, 685, 685, - 685, 685, 685, 685, 685, 685, 685, 596, 928, 708, - 928, 708, 708, 708, 595, 593, 562, 562, 562, 562, - 562, 562, 563, 589, 563, 563, 563, 563, 563, 563, - 563, 563, 563, 563, 566, 588, 566, 566, 566, 566, - 566, 566, 566, 566, 566, 566, 573, 573, 573, 573, - 573, 573, 573, 573, 573, 573, 573, 573, 573, 708, - 587, 571, 573, 573, 573, 573, 573, 709, 565, 709, - 709, 709, 710, 564, 710, 710, 710, 741, 741, 741, - 741, 741, 741, 930, 551, 930, 573, 573, 573, 573, - - 573, 573, 576, 576, 576, 576, 576, 576, 576, 576, - 576, 576, 576, 576, 938, 939, 938, 939, 576, 576, - 576, 576, 576, 942, 550, 544, 942, 709, 541, 943, - 942, 943, 710, 746, 746, 746, 746, 746, 746, 746, - 540, 539, 576, 576, 576, 576, 576, 576, 579, 538, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - 580, 714, 536, 714, 714, 714, 580, 714, 714, 580, - 580, 714, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 714, 714, 714, 580, 580, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 603, 770, 535, 770, 770, 770, 770, 770, 770, 603, - 944, 530, 944, 603, 603, 603, 603, 603, 603, 603, - 603, 603, 603, 603, 603, 603, 529, 497, 603, 603, - 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, - 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, - 496, 603, 603, 603, 603, 603, 603, 603, 603, 603, - 603, 603, 603, 603, 603, 603, 603, 603, 603, 606, - - 495, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 715, 715, 715, 715, 715, 715, 715, 715, 715, - 715, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 814, 814, 814, 814, 814, 814, 606, 613, 487, - 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, - 619, 486, 619, 619, 619, 619, 619, 619, 619, 619, - 619, 619, 619, 949, 485, 949, 619, 619, 619, 619, - 619, 738, 481, 738, 738, 738, 738, 738, 738, 950, - 474, 950, 778, 738, 778, 778, 778, 778, 778, 778, - 619, 619, 619, 619, 619, 619, 622, 473, 622, 622, - - 622, 622, 622, 622, 622, 622, 622, 622, 622, 469, - 468, 466, 622, 622, 622, 622, 622, 740, 740, 740, - 740, 740, 740, 740, 740, 740, 740, 787, 465, 787, - 787, 787, 787, 787, 787, 464, 622, 622, 622, 622, - 622, 622, 625, 625, 625, 625, 625, 625, 625, 625, - 625, 625, 625, 458, 457, 455, 625, 625, 625, 625, - 625, 754, 754, 754, 754, 754, 754, 754, 754, 754, - 754, 454, 765, 453, 765, 765, 765, 765, 765, 765, - 625, 625, 625, 625, 625, 625, 626, 452, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 637, 637, - - 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, - 765, 427, 426, 423, 637, 637, 637, 637, 637, 755, - 755, 755, 755, 755, 755, 755, 755, 755, 755, 820, - 422, 820, 820, 820, 820, 820, 820, 421, 637, 637, - 637, 637, 637, 637, 658, 420, 658, 658, 658, 658, - 658, 658, 658, 658, 658, 658, 664, 664, 664, 664, - 664, 664, 664, 664, 664, 664, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 783, 783, 783, 783, - 783, 783, 783, 783, 783, 783, 832, 832, 832, 832, - 832, 832, 664, 666, 414, 666, 666, 666, 666, 666, - - 666, 666, 666, 666, 666, 792, 792, 792, 792, 792, - 792, 792, 792, 792, 792, 793, 793, 793, 793, 793, - 793, 793, 793, 793, 793, 413, 948, 412, 411, 948, - 410, 666, 681, 948, 681, 681, 681, 681, 681, 681, - 681, 681, 681, 681, 681, 409, 408, 407, 681, 681, - 681, 681, 681, 794, 794, 794, 794, 794, 794, 794, - 794, 794, 794, 810, 406, 810, 810, 810, 810, 810, - 810, 405, 681, 681, 681, 681, 681, 681, 684, 404, - 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, - 684, 403, 402, 401, 684, 684, 684, 684, 684, 400, - - 397, 810, 812, 812, 812, 812, 812, 812, 812, 812, - 812, 812, 396, 391, 390, 389, 383, 381, 684, 684, - 684, 684, 684, 684, 687, 687, 687, 687, 687, 687, - 687, 687, 687, 687, 380, 379, 378, 377, 687, 687, - 687, 687, 687, 813, 813, 813, 813, 813, 813, 813, - 813, 813, 813, 376, 373, 372, 829, 829, 829, 829, - 829, 829, 687, 687, 687, 687, 687, 687, 688, 371, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, - 691, 724, 829, 724, 724, 724, 724, 724, 724, 724, - - 724, 724, 724, 725, 355, 725, 725, 725, 725, 725, - 725, 725, 725, 725, 725, 726, 354, 726, 726, 726, - 726, 726, 726, 726, 726, 726, 726, 729, 353, 729, - 729, 729, 729, 729, 729, 729, 729, 729, 729, 736, - 352, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 350, 349, 345, 736, 736, 736, 736, 736, - 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, - 344, 343, 341, 340, 339, 338, 337, 336, 335, 736, - 736, 736, 736, 736, 736, 739, 328, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 739, 327, 326, 319, - - 318, 739, 739, 739, 739, 739, 824, 824, 824, 824, - 824, 824, 824, 824, 824, 824, 317, 316, 315, 309, - 307, 306, 305, 304, 303, 739, 739, 739, 739, 739, - 739, 758, 302, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 761, 301, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 763, 298, 763, 763, 763, - 763, 763, 763, 763, 763, 763, 763, 764, 296, 764, - 764, 764, 764, 764, 764, 764, 764, 764, 764, 776, - 288, 776, 776, 776, 776, 776, 776, 776, 776, 776, - 776, 789, 287, 789, 789, 789, 789, 789, 789, 789, - - 789, 789, 789, 790, 284, 790, 790, 790, 790, 790, - 790, 790, 790, 790, 790, 791, 283, 791, 791, 791, - 791, 791, 791, 791, 791, 791, 791, 805, 276, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 806, - 275, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 808, 273, 808, 808, 808, 808, 808, 808, 808, - 808, 808, 808, 809, 272, 809, 809, 809, 809, 809, - 809, 809, 809, 809, 809, 821, 821, 821, 821, 821, - 821, 821, 821, 821, 821, 825, 825, 825, 825, 825, - 825, 825, 825, 825, 825, 826, 826, 826, 826, 826, - - 826, 826, 826, 826, 826, 271, 270, 269, 268, 267, - 266, 821, 822, 822, 822, 822, 822, 822, 822, 822, - 822, 822, 831, 831, 831, 831, 831, 831, 831, 831, - 831, 831, 265, 264, 261, 258, 257, 256, 250, 247, - 246, 245, 244, 243, 240, 239, 238, 237, 822, 823, - 823, 823, 823, 823, 823, 823, 823, 823, 823, 236, - 235, 234, 233, 232, 231, 230, 229, 228, 227, 221, - 220, 213, 212, 211, 210, 209, 208, 206, 205, 204, - 202, 196, 188, 184, 180, 823, 828, 828, 828, 828, - 828, 828, 828, 828, 828, 828, 179, 177, 173, 166, - - 162, 160, 158, 150, 149, 148, 147, 146, 140, 139, - 138, 137, 136, 134, 133, 132, 131, 130, 126, 122, - 121, 117, 828, 834, 834, 834, 834, 834, 834, 834, - 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, - 834, 834, 834, 834, 835, 835, 835, 835, 835, 835, - 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, - 835, 835, 835, 835, 835, 836, 836, 836, 836, 836, - 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, - 836, 836, 836, 836, 836, 836, 837, 837, 837, 837, - 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, - - 837, 837, 837, 837, 837, 837, 837, 838, 114, 111, - 106, 105, 104, 102, 838, 98, 838, 838, 838, 838, - 97, 96, 838, 838, 838, 838, 838, 838, 839, 839, - 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, - 839, 839, 839, 839, 839, 839, 839, 839, 839, 840, - 95, 94, 91, 78, 840, 71, 840, 64, 840, 840, - 840, 840, 840, 60, 840, 840, 840, 840, 840, 840, - 841, 59, 57, 56, 54, 52, 44, 841, 43, 841, - 841, 841, 841, 42, 40, 841, 841, 841, 841, 841, - 841, 842, 39, 35, 842, 842, 31, 842, 842, 25, - - 842, 842, 842, 842, 19, 17, 842, 842, 842, 842, - 842, 842, 843, 843, 16, 843, 15, 0, 0, 843, - 845, 0, 0, 845, 845, 0, 845, 845, 0, 845, - 845, 845, 845, 0, 0, 845, 845, 845, 845, 845, - 845, 846, 0, 0, 846, 846, 0, 846, 846, 0, - 846, 846, 846, 846, 0, 846, 846, 846, 0, 846, - 846, 846, 848, 0, 0, 848, 0, 0, 848, 848, - 0, 848, 848, 848, 848, 848, 0, 848, 848, 848, - 848, 848, 848, 849, 849, 849, 849, 849, 849, 849, - 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, - - 849, 849, 849, 849, 850, 850, 0, 850, 0, 850, - 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 851, 0, 0, 0, 0, - 851, 0, 851, 0, 851, 851, 851, 851, 851, 0, - 851, 851, 851, 851, 851, 851, 852, 0, 0, 0, - 0, 0, 0, 852, 0, 852, 852, 852, 852, 0, - 852, 852, 852, 852, 852, 852, 852, 853, 0, 0, - 853, 853, 0, 853, 853, 0, 853, 853, 853, 853, - 0, 853, 853, 853, 853, 853, 853, 853, 854, 854, - 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, - - 854, 854, 854, 854, 854, 854, 854, 854, 854, 855, - 855, 0, 855, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, - 857, 0, 0, 857, 857, 0, 857, 857, 0, 857, - 857, 857, 857, 0, 0, 857, 857, 857, 857, 857, - 857, 858, 858, 0, 858, 0, 0, 0, 858, 859, - 859, 0, 859, 0, 0, 0, 859, 860, 860, 860, - 0, 860, 0, 0, 0, 860, 861, 0, 0, 861, - 861, 0, 861, 861, 0, 861, 861, 861, 861, 0, - 0, 861, 861, 861, 861, 861, 861, 862, 0, 0, - - 862, 862, 0, 862, 862, 0, 862, 862, 862, 862, - 0, 0, 862, 862, 862, 862, 862, 862, 863, 0, - 0, 863, 863, 0, 863, 863, 0, 863, 863, 863, - 863, 0, 863, 863, 863, 0, 863, 863, 863, 865, - 0, 0, 865, 0, 0, 865, 865, 0, 865, 865, - 865, 865, 865, 0, 865, 865, 865, 865, 865, 865, - 866, 0, 0, 0, 0, 0, 0, 866, 0, 866, - 866, 866, 866, 0, 0, 866, 866, 866, 866, 866, - 866, 867, 0, 0, 0, 0, 0, 0, 867, 0, - 867, 867, 867, 867, 0, 867, 867, 867, 867, 867, - - 867, 867, 868, 0, 0, 868, 868, 0, 868, 868, - 0, 868, 868, 868, 868, 0, 868, 868, 868, 868, - 868, 868, 868, 869, 0, 0, 869, 869, 0, 869, - 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, - 870, 871, 871, 0, 871, 0, 0, 0, 871, 872, - 872, 872, 0, 872, 0, 0, 0, 872, 875, 875, - 0, 875, 0, 0, 0, 875, 876, 876, 0, 876, - 0, 0, 0, 876, 877, 877, 0, 877, 0, 0, - 0, 877, 878, 878, 878, 0, 878, 0, 0, 0, - - 878, 879, 0, 0, 879, 879, 0, 879, 880, 880, - 0, 880, 0, 0, 0, 880, 881, 881, 0, 881, - 0, 0, 0, 881, 882, 882, 0, 882, 0, 0, - 0, 882, 883, 883, 883, 0, 883, 0, 0, 0, - 883, 884, 884, 884, 884, 0, 884, 0, 0, 0, - 884, 887, 887, 0, 887, 0, 0, 0, 887, 888, - 888, 0, 888, 0, 0, 0, 888, 889, 889, 0, - 889, 0, 0, 0, 889, 892, 892, 892, 0, 892, - 0, 0, 0, 892, 893, 893, 893, 893, 0, 893, - 0, 0, 0, 893, 894, 894, 894, 894, 894, 894, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 258, 254, 258, 38, 38, 38, 38, 38, + 38, 259, 398, 181, 181, 38, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 259, 261, 331, 331, + 38, 38, 38, 38, 38, 38, 46, 46, 46, 46, + 46, 261, 46, 46, 845, 398, 46, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 254, 185, 832, + + 46, 46, 46, 47, 181, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 50, 68, 68, 68, 114, + 68, 294, 294, 294, 68, 50, 68, 479, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 148, 114, + 68, 68, 282, 282, 479, 282, 105, 185, 105, 105, + 105, 85, 105, 105, 188, 177, 105, 85, 177, 177, + 85, 305, 330, 85, 85, 177, 114, 68, 148, 148, + 105, 105, 105, 148, 188, 50, 69, 85, 309, 85, + 177, 148, 308, 290, 148, 305, 69, 308, 227, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 227, + + 324, 188, 309, 85, 85, 86, 324, 831, 86, 86, + 290, 86, 86, 86, 86, 344, 297, 86, 86, 115, + 344, 115, 115, 330, 334, 115, 115, 297, 400, 115, + 334, 86, 86, 86, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 115, 115, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 828, 86, 86, 87, + 333, 400, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 333, 342, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 342, 399, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 90, 345, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 399, 567, 567, 90, 90, 90, 90, + 90, 90, 368, 825, 117, 345, 117, 117, 117, 321, + 117, 117, 321, 368, 117, 202, 202, 202, 202, 202, + 202, 90, 90, 90, 90, 90, 90, 91, 117, 117, + 117, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 321, 381, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + + 91, 91, 91, 91, 91, 91, 91, 91, 91, 381, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 406, + 606, 606, 95, 95, 95, 95, 95, 95, 402, 823, + 118, 118, 95, 402, 118, 118, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 387, 95, 95, 95, + 95, 95, 95, 101, 118, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 120, 189, 120, 120, 120, + 387, 120, 120, 247, 247, 120, 247, 401, 474, 118, + + 222, 222, 222, 222, 222, 222, 189, 406, 474, 120, + 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 164, 164, 211, 211, 164, 164, 247, 814, + 211, 211, 401, 189, 211, 480, 211, 166, 541, 166, + 166, 166, 541, 166, 166, 480, 164, 166, 432, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 536, 166, 166, 166, 122, 122, 122, 122, 122, 122, + 536, 164, 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 289, 289, 289, 289, 605, 432, 605, 122, + 122, 122, 122, 122, 122, 130, 130, 130, 130, 130, + + 130, 130, 130, 130, 130, 130, 332, 813, 407, 130, + 130, 130, 130, 130, 130, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 301, 301, 301, 301, 301, + 301, 407, 554, 332, 130, 130, 130, 130, 130, 130, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 332, 370, 370, 131, 131, 131, 131, 131, 131, + 190, 408, 190, 190, 370, 192, 190, 190, 409, 477, + 190, 192, 408, 409, 192, 372, 372, 192, 192, 131, + 131, 131, 131, 131, 131, 190, 190, 372, 554, 459, + 196, 192, 441, 192, 196, 194, 812, 194, 194, 194, + + 196, 194, 194, 441, 339, 194, 339, 339, 339, 339, + 339, 339, 445, 459, 196, 196, 478, 192, 192, 194, + 194, 194, 195, 445, 477, 195, 195, 478, 195, 195, + 195, 195, 459, 803, 195, 195, 201, 201, 201, 201, + 201, 201, 201, 201, 201, 201, 802, 460, 195, 195, + 195, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 218, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 460, 556, 800, 195, 195, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 661, 661, 556, 460, + 198, 198, 198, 198, 198, 198, 221, 221, 221, 221, + + 221, 221, 221, 221, 221, 221, 378, 378, 378, 378, + 378, 378, 446, 446, 462, 198, 198, 198, 198, 198, + 198, 203, 662, 662, 446, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 462, 465, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 465, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 799, 466, 461, 204, 204, 204, 204, + + 204, 204, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 573, 573, 573, 573, 447, 447, 466, 461, + 463, 204, 204, 204, 204, 204, 204, 220, 447, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 260, + 461, 467, 466, 260, 463, 551, 671, 671, 540, 260, + 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, + 540, 463, 551, 260, 260, 467, 220, 223, 519, 223, + 223, 223, 223, 223, 223, 223, 223, 223, 223, 519, + 797, 467, 468, 223, 223, 223, 223, 223, 223, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 455, + + 455, 455, 455, 455, 455, 796, 468, 570, 223, 223, + 223, 223, 223, 223, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 469, 486, 489, 226, 226, + 226, 226, 226, 226, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 609, 570, 609, 491, 492, 469, + 486, 489, 491, 226, 226, 226, 226, 226, 226, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 616, 492, 616, 228, 228, 228, 228, 228, 228, + 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, + 485, 795, 485, 485, 485, 485, 485, 485, 785, 228, + + 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 495, 496, 533, 229, + 229, 229, 229, 229, 229, 375, 375, 375, 375, 375, + 375, 375, 375, 537, 635, 635, 635, 375, 538, 537, + 495, 496, 533, 784, 229, 229, 229, 229, 229, 229, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 668, 538, 668, 230, 230, 230, 230, 230, 230, + 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, + 435, 775, 435, 435, 435, 435, 435, 435, 773, 230, + 230, 230, 230, 230, 230, 265, 543, 265, 265, 265, + + 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 772, 435, + 543, 266, 266, 266, 266, 266, 266, 448, 448, 448, + 448, 448, 448, 448, 448, 448, 448, 504, 504, 504, + 504, 504, 504, 679, 679, 771, 266, 266, 266, 266, + 266, 266, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 449, 449, 547, 759, 268, 268, 268, 268, + 268, 268, 520, 557, 449, 452, 452, 452, 452, 452, + 452, 452, 452, 520, 545, 722, 722, 452, 547, 545, + 557, 268, 268, 268, 268, 268, 268, 285, 285, 285, + + 285, 285, 285, 285, 285, 285, 285, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 481, 481, 481, + 481, 481, 481, 481, 481, 481, 481, 511, 511, 511, + 511, 511, 511, 758, 285, 293, 293, 293, 293, 293, + 293, 293, 293, 293, 293, 293, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 549, + 680, 566, 299, 299, 299, 299, 299, 299, 503, 503, + 503, 503, 503, 503, 503, 503, 503, 503, 566, 608, + 756, 464, 666, 549, 608, 666, 755, 299, 299, 299, + 299, 299, 299, 302, 302, 302, 302, 302, 302, 302, + + 302, 302, 302, 302, 302, 464, 521, 521, 302, 302, + 302, 302, 302, 302, 672, 748, 607, 464, 521, 672, + 680, 746, 464, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 302, 302, 302, 302, 302, 302, 303, + 607, 303, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 745, 727, 607, 727, 340, 340, 340, 340, 340, + 340, 510, 510, 510, 510, 510, 510, 510, 510, 510, + 510, 518, 610, 518, 518, 518, 518, 518, 518, 693, + 340, 340, 340, 340, 340, 340, 341, 341, 341, 341, + + 341, 341, 341, 341, 341, 341, 610, 744, 629, 630, + 341, 341, 341, 341, 341, 341, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 728, 728, 693, 610, + 522, 522, 629, 630, 741, 341, 341, 341, 341, 341, + 341, 358, 522, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 359, 577, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 360, 577, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 360, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, 373, 373, + 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, + + 373, 615, 615, 611, 373, 373, 373, 373, 373, 373, + 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, + 530, 530, 530, 530, 530, 530, 779, 611, 779, 373, + 373, 373, 373, 373, 373, 376, 376, 376, 376, 376, + 376, 376, 376, 376, 376, 376, 376, 376, 524, 524, + 611, 376, 376, 376, 376, 376, 376, 615, 579, 542, + 524, 527, 527, 527, 527, 527, 527, 527, 527, 542, + 579, 669, 667, 527, 731, 731, 376, 376, 376, 376, + 376, 376, 379, 379, 379, 379, 379, 379, 379, 379, + 379, 379, 379, 379, 739, 669, 667, 379, 379, 379, + + 379, 379, 379, 529, 529, 529, 529, 529, 529, 529, + 529, 529, 529, 696, 696, 696, 696, 673, 546, 667, + 781, 781, 379, 379, 379, 379, 379, 379, 380, 546, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 412, 673, 412, 412, 412, 412, 412, 412, 412, 412, + 412, 412, 413, 413, 413, 413, 413, 413, 413, 413, + 413, 413, 555, 733, 734, 675, 413, 413, 413, 413, + 413, 413, 555, 576, 576, 576, 576, 576, 576, 576, + 576, 576, 576, 585, 585, 585, 585, 585, 585, 675, + 730, 413, 413, 413, 413, 413, 413, 431, 431, 431, + + 431, 431, 431, 431, 431, 431, 431, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 582, 641, 582, + 582, 582, 582, 582, 582, 591, 810, 810, 733, 582, + 641, 697, 681, 790, 431, 433, 591, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 434, 681, 434, + 434, 434, 434, 434, 434, 434, 434, 434, 434, 440, + 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, + 697, 678, 790, 440, 440, 440, 440, 440, 440, 584, + 584, 584, 584, 584, 584, 584, 584, 584, 584, 806, + 806, 806, 806, 678, 592, 678, 678, 729, 440, 440, + + 440, 440, 440, 440, 444, 592, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, 450, 593, + 593, 688, 450, 450, 450, 450, 450, 450, 594, 594, + 642, 593, 596, 596, 602, 602, 602, 602, 602, 602, + 594, 723, 642, 691, 596, 688, 721, 450, 450, 450, + 450, 450, 450, 453, 453, 453, 453, 453, 453, 453, + 453, 453, 453, 453, 453, 453, 902, 691, 902, 453, + 453, 453, 453, 453, 453, 599, 599, 599, 599, 599, + 599, 599, 599, 829, 829, 691, 718, 599, 650, 650, + + 650, 650, 650, 650, 453, 453, 453, 453, 453, 453, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 617, 717, 690, 456, 456, 456, 456, 456, + 456, 601, 601, 601, 601, 601, 601, 601, 601, 601, + 601, 875, 875, 875, 617, 644, 617, 617, 690, 689, + 456, 456, 456, 456, 456, 456, 457, 644, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 457, 458, 458, + 690, 617, 872, 689, 458, 872, 884, 458, 458, 884, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 689, 704, 458, 458, 458, 458, + + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 502, + 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 623, 623, 623, 623, 623, 623, 623, 633, 633, 633, + 633, 633, 633, 633, 633, 633, 633, 502, 509, 705, + 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, + 509, 705, 931, 931, 509, 509, 509, 509, 509, 509, + + 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, + 657, 703, 657, 657, 657, 657, 657, 657, 701, 509, + 509, 509, 509, 509, 509, 512, 512, 512, 512, 512, + 512, 512, 512, 512, 512, 512, 700, 724, 749, 512, + 512, 512, 512, 512, 512, 643, 643, 643, 643, 643, + 643, 643, 643, 643, 643, 687, 699, 687, 687, 687, + 658, 724, 749, 685, 512, 512, 512, 512, 512, 512, + 513, 658, 513, 513, 513, 513, 513, 513, 513, 513, + 513, 513, 525, 525, 525, 525, 525, 525, 525, 525, + 525, 525, 525, 525, 525, 726, 932, 932, 525, 525, + + 525, 525, 525, 525, 647, 706, 647, 647, 647, 647, + 647, 647, 892, 892, 892, 684, 647, 706, 682, 726, + 682, 682, 682, 525, 525, 525, 525, 525, 525, 528, + 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, + 528, 528, 726, 943, 943, 528, 528, 528, 528, 528, + 528, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 665, 665, 665, 665, 665, 665, 665, 665, 682, + 528, 528, 528, 528, 528, 528, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 776, 677, 778, + 750, 531, 531, 531, 531, 531, 531, 653, 653, 653, + + 653, 653, 653, 653, 653, 653, 653, 903, 914, 903, + 914, 776, 659, 778, 750, 787, 531, 531, 531, 531, + 531, 531, 532, 659, 532, 532, 532, 532, 532, 532, + 532, 532, 532, 532, 535, 750, 778, 962, 962, 787, + 535, 740, 740, 535, 535, 740, 535, 535, 535, 535, + 535, 535, 535, 535, 535, 535, 535, 535, 535, 740, + 740, 740, 535, 535, 535, 535, 535, 535, 535, 535, + 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, + 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, + 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, + + 535, 535, 535, 535, 535, 560, 560, 560, 560, 560, + 560, 560, 560, 560, 560, 560, 563, 963, 963, 708, + 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, + 563, 708, 563, 656, 807, 563, 563, 563, 563, 563, + 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, + 563, 563, 563, 563, 563, 563, 563, 563, 807, 563, + 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, + 563, 563, 563, 563, 563, 563, 563, 569, 569, 569, + 569, 569, 569, 569, 569, 569, 569, 660, 660, 683, + 655, 683, 683, 683, 915, 919, 915, 919, 760, 660, + + 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, + 760, 654, 640, 835, 569, 571, 571, 571, 571, 571, + 571, 571, 571, 571, 571, 571, 702, 816, 702, 702, + 702, 702, 702, 702, 714, 714, 714, 714, 714, 714, + 683, 707, 707, 707, 707, 707, 707, 707, 707, 707, + 707, 816, 835, 571, 580, 638, 580, 580, 580, 580, + 580, 580, 580, 580, 580, 580, 580, 583, 761, 583, + 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, + 761, 751, 826, 583, 583, 583, 583, 583, 583, 711, + 637, 711, 711, 711, 711, 711, 711, 920, 636, 920, + + 735, 711, 735, 735, 735, 751, 826, 628, 583, 583, + 583, 583, 583, 583, 586, 586, 586, 586, 586, 586, + 586, 586, 586, 586, 586, 627, 625, 751, 586, 586, + 586, 586, 586, 586, 713, 713, 713, 713, 713, 713, + 713, 713, 713, 713, 924, 927, 924, 927, 937, 720, + 937, 735, 624, 586, 586, 586, 586, 586, 586, 587, + 720, 587, 587, 587, 587, 587, 587, 587, 587, 587, + 587, 590, 622, 590, 590, 590, 590, 590, 590, 590, + 590, 590, 590, 597, 597, 597, 597, 597, 597, 597, + 597, 597, 597, 597, 597, 597, 621, 788, 809, 597, + + 597, 597, 597, 597, 597, 736, 620, 736, 736, 736, + 737, 763, 737, 737, 737, 738, 618, 738, 738, 738, + 614, 788, 809, 763, 597, 597, 597, 597, 597, 597, + 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 788, 801, 613, 809, 600, 600, 600, 600, + 600, 600, 938, 612, 938, 801, 736, 946, 947, 946, + 947, 737, 950, 956, 950, 956, 738, 957, 959, 957, + 959, 600, 600, 600, 600, 600, 600, 603, 595, 603, + 603, 603, 603, 603, 603, 603, 603, 603, 603, 604, + 742, 589, 742, 742, 742, 604, 742, 742, 604, 604, + + 742, 604, 604, 604, 604, 604, 604, 604, 604, 604, + 604, 604, 604, 604, 742, 742, 742, 604, 604, 604, + 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, + 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, + 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, + 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, + 626, 747, 588, 747, 747, 747, 747, 747, 747, 626, + 967, 575, 967, 626, 626, 626, 626, 626, 626, 626, + 626, 626, 626, 626, 626, 626, 574, 568, 626, 626, + 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, + + 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, + 626, 565, 626, 626, 626, 626, 626, 626, 626, 626, + 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, + 632, 564, 632, 632, 632, 632, 632, 632, 632, 632, + 632, 632, 743, 743, 743, 743, 743, 743, 743, 743, + 743, 743, 762, 762, 762, 762, 762, 762, 762, 762, + 762, 762, 769, 769, 769, 769, 769, 769, 965, 632, + 639, 965, 639, 639, 639, 639, 639, 639, 639, 639, + 639, 639, 645, 562, 645, 645, 645, 645, 645, 645, + 645, 645, 645, 645, 645, 648, 561, 648, 648, 648, + + 648, 648, 648, 648, 648, 648, 648, 648, 968, 559, + 968, 648, 648, 648, 648, 648, 648, 766, 558, 766, + 766, 766, 766, 766, 766, 971, 553, 971, 798, 766, + 798, 798, 798, 798, 798, 798, 648, 648, 648, 648, + 648, 648, 651, 651, 651, 651, 651, 651, 651, 651, + 651, 651, 651, 972, 552, 972, 651, 651, 651, 651, + 651, 651, 768, 768, 768, 768, 768, 768, 768, 768, + 768, 768, 774, 774, 774, 774, 774, 774, 774, 517, + 516, 651, 651, 651, 651, 651, 651, 652, 515, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 663, + + 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, + 663, 686, 507, 686, 686, 686, 686, 686, 686, 686, + 686, 686, 686, 692, 692, 692, 692, 692, 692, 692, + 692, 692, 692, 782, 782, 782, 782, 782, 782, 782, + 782, 782, 782, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 842, 842, 842, 842, 842, 842, 506, + 692, 694, 505, 694, 694, 694, 694, 694, 694, 694, + 694, 694, 694, 977, 501, 977, 793, 494, 793, 793, + 793, 793, 793, 793, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 860, 860, 860, 860, 860, 860, + + 694, 709, 493, 709, 709, 709, 709, 709, 709, 709, + 709, 709, 709, 709, 712, 793, 712, 712, 712, 712, + 712, 712, 712, 712, 712, 712, 712, 978, 490, 978, + 712, 712, 712, 712, 712, 712, 811, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 815, 488, 815, 815, + 815, 815, 815, 815, 487, 712, 712, 712, 712, 712, + 712, 715, 715, 715, 715, 715, 715, 715, 715, 715, + 715, 484, 483, 482, 476, 715, 715, 715, 715, 715, + 715, 820, 820, 820, 820, 820, 820, 820, 820, 820, + 820, 838, 475, 838, 838, 838, 838, 838, 838, 473, + + 715, 715, 715, 715, 715, 715, 716, 472, 716, 716, + 716, 716, 716, 716, 716, 716, 716, 716, 719, 719, + 719, 719, 719, 719, 719, 719, 719, 719, 719, 752, + 838, 752, 752, 752, 752, 752, 752, 752, 752, 752, + 752, 753, 471, 753, 753, 753, 753, 753, 753, 753, + 753, 753, 753, 754, 470, 754, 754, 754, 754, 754, + 754, 754, 754, 754, 754, 757, 443, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 757, 764, 442, 764, + 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, + 767, 439, 767, 767, 767, 767, 767, 767, 767, 767, + + 767, 767, 438, 437, 436, 430, 767, 767, 767, 767, + 767, 767, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 848, 429, 848, 848, 848, 848, 848, 848, + 428, 767, 767, 767, 767, 767, 767, 770, 427, 770, + 770, 770, 770, 770, 770, 770, 770, 770, 770, 786, + 426, 786, 786, 786, 786, 786, 786, 786, 786, 786, + 786, 789, 425, 789, 789, 789, 789, 789, 789, 789, + 789, 789, 789, 791, 424, 791, 791, 791, 791, 791, + 791, 791, 791, 791, 791, 792, 423, 792, 792, 792, + 792, 792, 792, 792, 792, 792, 792, 804, 422, 804, + + 804, 804, 804, 804, 804, 804, 804, 804, 804, 817, + 421, 817, 817, 817, 817, 817, 817, 817, 817, 817, + 817, 818, 420, 818, 818, 818, 818, 818, 818, 818, + 818, 818, 818, 819, 419, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 822, 822, 822, 822, 822, + 822, 822, 822, 822, 822, 833, 418, 833, 833, 833, + 833, 833, 833, 833, 833, 833, 833, 834, 417, 834, + 834, 834, 834, 834, 834, 834, 834, 834, 834, 836, + 416, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 837, 415, 837, 837, 837, 837, 837, 837, 837, + + 837, 837, 837, 840, 840, 840, 840, 840, 840, 840, + 840, 840, 840, 841, 841, 841, 841, 841, 841, 841, + 841, 841, 841, 844, 844, 844, 844, 844, 844, 844, + 844, 844, 844, 849, 849, 849, 849, 849, 849, 849, + 849, 849, 849, 852, 852, 852, 852, 852, 852, 852, + 852, 852, 852, 853, 853, 853, 853, 853, 853, 853, + 853, 853, 853, 857, 857, 857, 857, 857, 857, 414, + 849, 850, 850, 850, 850, 850, 850, 850, 850, 850, + 850, 854, 854, 854, 854, 854, 854, 854, 854, 854, + 854, 976, 411, 410, 976, 405, 404, 403, 976, 397, + + 857, 395, 394, 393, 392, 391, 390, 389, 850, 851, + 851, 851, 851, 851, 851, 851, 851, 851, 851, 859, + 859, 859, 859, 859, 859, 859, 859, 859, 859, 386, + 385, 384, 383, 367, 366, 365, 364, 362, 361, 357, + 356, 355, 353, 352, 351, 350, 851, 856, 856, 856, + 856, 856, 856, 856, 856, 856, 856, 349, 348, 347, + 346, 343, 338, 337, 336, 329, 328, 327, 326, 325, + 319, 317, 316, 315, 314, 313, 312, 311, 310, 307, + 306, 304, 296, 295, 856, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, + + 862, 862, 862, 862, 862, 862, 863, 863, 863, 863, + 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, + 863, 863, 863, 863, 863, 863, 863, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 864, 864, 865, 865, + 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, + 865, 865, 865, 865, 865, 865, 865, 865, 865, 866, + 292, 291, 284, 283, 281, 280, 866, 279, 866, 866, + 866, 866, 278, 277, 866, 866, 866, 866, 866, 866, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 868, 276, 275, 274, 273, 868, 272, 868, 271, + 868, 868, 868, 868, 868, 270, 868, 868, 868, 868, + 868, 868, 869, 267, 264, 263, 262, 256, 253, 869, + 252, 869, 869, 869, 869, 251, 250, 869, 869, 869, + 869, 869, 869, 870, 249, 246, 870, 870, 245, 870, + 870, 244, 870, 870, 870, 870, 243, 242, 870, 870, + 870, 870, 870, 870, 871, 871, 241, 871, 240, 239, + 238, 871, 873, 237, 236, 873, 873, 235, 873, 873, + 234, 873, 873, 873, 873, 233, 232, 873, 873, 873, + + 873, 873, 873, 874, 231, 225, 874, 874, 224, 874, + 874, 217, 874, 874, 874, 874, 216, 874, 874, 874, + 215, 874, 874, 874, 876, 214, 213, 876, 212, 210, + 876, 876, 209, 876, 876, 876, 876, 876, 208, 876, + 876, 876, 876, 876, 876, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 878, 878, 207, 878, + 205, 878, 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 879, 199, 191, + 187, 183, 879, 182, 879, 180, 879, 879, 879, 879, + + 879, 176, 879, 879, 879, 879, 879, 879, 880, 169, + 165, 163, 161, 153, 152, 880, 151, 880, 880, 880, + 880, 150, 880, 880, 880, 880, 880, 880, 880, 881, + 149, 143, 881, 881, 142, 881, 881, 141, 881, 881, + 881, 881, 140, 881, 881, 881, 881, 881, 881, 881, + 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, + 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, + 882, 883, 883, 139, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 885, 137, 136, 885, 885, 135, 885, 885, + + 134, 885, 885, 885, 885, 133, 132, 885, 885, 885, + 885, 885, 885, 886, 886, 128, 886, 124, 123, 119, + 886, 887, 887, 116, 887, 113, 108, 107, 887, 888, + 888, 888, 106, 888, 104, 100, 99, 888, 889, 98, + 97, 889, 889, 96, 889, 889, 92, 889, 889, 889, + 889, 79, 72, 889, 889, 889, 889, 889, 889, 890, + 65, 61, 890, 890, 60, 890, 890, 58, 890, 890, + 890, 890, 57, 55, 890, 890, 890, 890, 890, 890, + 891, 53, 45, 891, 891, 44, 891, 891, 43, 891, + 891, 891, 891, 41, 891, 891, 891, 40, 891, 891, + + 891, 893, 35, 31, 893, 25, 19, 893, 893, 17, + 893, 893, 893, 893, 893, 16, 893, 893, 893, 893, + 893, 893, 894, 894, 15, 894, 0, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, - 894, 894, 894, 894, 894, 896, 896, 0, 896, 0, - 0, 0, 896, 897, 897, 0, 897, 0, 0, 0, - 897, 899, 899, 899, 0, 899, 0, 0, 0, 899, - 900, 900, 900, 900, 0, 900, 0, 0, 0, 900, - 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, - 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, - 901, 904, 0, 0, 904, 904, 0, 904, 905, 0, - 0, 0, 905, 905, 0, 905, 905, 905, 0, 0, - 905, 905, 906, 906, 0, 906, 0, 0, 0, 906, - - 907, 0, 907, 907, 0, 907, 0, 0, 0, 907, - 910, 910, 910, 0, 910, 0, 0, 0, 910, 911, - 911, 911, 911, 0, 911, 0, 0, 0, 911, 912, - 912, 0, 0, 912, 0, 0, 0, 912, 913, 913, - 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, - 913, 913, 913, 913, 913, 913, 913, 913, 913, 915, - 0, 0, 915, 915, 0, 915, 916, 0, 0, 0, - 916, 916, 0, 916, 916, 916, 0, 0, 916, 916, - 919, 919, 0, 919, 0, 0, 0, 919, 920, 0, - 920, 920, 0, 920, 0, 0, 0, 920, 922, 922, - + 894, 894, 894, 895, 0, 0, 0, 0, 0, 0, + 895, 0, 895, 895, 895, 895, 0, 0, 895, 895, + 895, 895, 895, 895, 896, 0, 0, 0, 0, 0, + 0, 896, 0, 896, 896, 896, 896, 0, 896, 896, + 896, 896, 896, 896, 896, 897, 0, 0, 897, 897, + 0, 897, 897, 0, 897, 897, 897, 897, 0, 897, + + 897, 897, 897, 897, 897, 897, 898, 0, 0, 898, + 898, 0, 898, 899, 899, 899, 899, 899, 899, 899, + 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, + 899, 899, 899, 899, 900, 900, 0, 900, 0, 0, + 0, 900, 901, 901, 901, 0, 901, 0, 0, 0, + 901, 904, 904, 0, 904, 0, 0, 0, 904, 905, + 905, 0, 905, 0, 0, 0, 905, 906, 906, 0, + 906, 0, 0, 0, 906, 907, 907, 907, 0, 907, + 0, 0, 0, 907, 908, 0, 0, 908, 908, 0, + 908, 909, 909, 0, 909, 0, 0, 0, 909, 910, + + 910, 0, 910, 0, 0, 0, 910, 911, 911, 0, + 911, 0, 0, 0, 911, 912, 912, 912, 0, 912, + 0, 0, 0, 912, 913, 913, 913, 913, 0, 913, + 0, 0, 0, 913, 916, 916, 0, 916, 0, 0, + 0, 916, 917, 917, 0, 917, 0, 0, 0, 917, + 918, 918, 0, 918, 0, 0, 0, 918, 921, 921, + 921, 0, 921, 0, 0, 0, 921, 922, 922, 922, 922, 0, 922, 0, 0, 0, 922, 923, 923, 923, - 0, 0, 923, 0, 0, 0, 923, 924, 924, 924, - 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, - 924, 924, 924, 924, 924, 924, 924, 924, 925, 925, - 0, 925, 925, 925, 0, 925, 0, 925, 925, 925, - 925, 0, 0, 925, 925, 925, 925, 925, 925, 926, - 926, 0, 926, 926, 926, 0, 926, 0, 926, 926, - 926, 926, 0, 0, 926, 926, 926, 926, 926, 926, - 929, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 929, 929, 0, 929, 929, 0, 929, 931, 931, - - 0, 931, 0, 0, 0, 931, 932, 0, 932, 932, - 0, 932, 0, 0, 0, 932, 935, 935, 0, 0, - 935, 0, 0, 0, 935, 937, 0, 0, 0, 0, - 0, 0, 937, 0, 937, 937, 937, 937, 0, 0, - 937, 937, 937, 937, 937, 937, 940, 940, 0, 940, - 0, 0, 0, 940, 941, 0, 941, 941, 0, 941, - 0, 0, 0, 941, 945, 945, 0, 945, 0, 0, - 0, 945, 946, 0, 946, 0, 0, 946, 0, 0, - 0, 946, 947, 947, 947, 947, 947, 947, 947, 947, - 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, - - 947, 947, 947, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833 + 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, + 923, 923, 923, 923, 923, 923, 923, 923, 925, 925, + + 0, 925, 0, 0, 0, 925, 926, 926, 0, 926, + 0, 0, 0, 926, 928, 928, 928, 0, 928, 0, + 0, 0, 928, 929, 929, 929, 929, 0, 929, 0, + 0, 0, 929, 930, 930, 930, 930, 930, 930, 930, + 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, + 930, 930, 930, 930, 933, 0, 0, 933, 933, 0, + 933, 934, 0, 0, 0, 934, 934, 0, 934, 934, + 934, 0, 0, 934, 934, 935, 935, 0, 935, 0, + 0, 0, 935, 936, 0, 936, 936, 0, 936, 0, + 0, 0, 936, 939, 939, 939, 0, 939, 0, 0, + + 0, 939, 940, 940, 940, 940, 0, 940, 0, 0, + 0, 940, 941, 941, 0, 0, 941, 0, 0, 0, + 941, 942, 942, 942, 942, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, + 942, 942, 944, 0, 0, 944, 944, 0, 944, 945, + 0, 0, 0, 945, 945, 0, 945, 945, 945, 0, + 0, 945, 945, 948, 948, 0, 948, 0, 0, 0, + 948, 949, 0, 949, 949, 0, 949, 0, 0, 0, + 949, 951, 951, 951, 0, 951, 0, 0, 0, 951, + 952, 952, 952, 0, 0, 952, 0, 0, 0, 952, + + 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, + 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, + 953, 954, 954, 0, 954, 954, 954, 0, 954, 0, + 954, 954, 954, 954, 0, 0, 954, 954, 954, 954, + 954, 954, 955, 955, 0, 955, 955, 955, 0, 955, + 0, 955, 955, 955, 955, 0, 0, 955, 955, 955, + 955, 955, 955, 958, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 958, 958, 0, 958, 958, 0, + 958, 960, 960, 0, 960, 0, 0, 0, 960, 961, + 0, 961, 961, 0, 961, 0, 0, 0, 961, 964, + + 964, 0, 0, 964, 0, 0, 0, 964, 966, 0, + 0, 0, 0, 0, 0, 966, 0, 966, 966, 966, + 966, 0, 0, 966, 966, 966, 966, 966, 966, 969, + 969, 0, 969, 0, 0, 0, 969, 970, 0, 970, + 970, 0, 970, 0, 0, 0, 970, 973, 973, 0, + 973, 0, 0, 0, 973, 974, 0, 974, 0, 0, + 974, 0, 0, 0, 974, 975, 975, 975, 975, 975, + 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, + 975, 975, 975, 975, 975, 975, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 861 } ; static yy_state_type yy_last_accepting_state; @@ -2039,7 +2045,7 @@ int (*trace_print)(const char *msg) = sudoers_trace_print; #define WANTDIGEST 6 -#line 2042 "lex.sudoers.c" +#line 2048 "lex.sudoers.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -2195,7 +2201,7 @@ YY_DECL #line 120 "toke.l" -#line 2198 "lex.sudoers.c" +#line 2204 "lex.sudoers.c" if ( yy_init ) { @@ -2247,13 +2253,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 834 ) + if ( yy_current_state >= 862 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 5604 ); + while ( yy_base[yy_current_state] != 5587 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -2723,15 +2729,31 @@ YY_RULE_SETUP case 36: YY_RULE_SETUP #line 457 "toke.l" +{ + LEXTRACE("FOLLOW "); + LEXRETURN(FOLLOW); + } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 462 "toke.l" +{ + LEXTRACE("NOFOLLOW "); + LEXRETURN(NOFOLLOW); + } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 467 "toke.l" { /* empty group or netgroup */ LEXTRACE("ERROR "); LEXRETURN(ERROR); } YY_BREAK -case 37: +case 39: YY_RULE_SETUP -#line 463 "toke.l" +#line 473 "toke.l" { /* netgroup */ if (!fill(sudoerstext, sudoersleng)) @@ -2740,9 +2762,9 @@ YY_RULE_SETUP LEXRETURN(NETGROUP); } YY_BREAK -case 38: +case 40: YY_RULE_SETUP -#line 471 "toke.l" +#line 481 "toke.l" { /* group */ if (!fill(sudoerstext, sudoersleng)) @@ -2751,9 +2773,9 @@ YY_RULE_SETUP LEXRETURN(USERGROUP); } YY_BREAK -case 39: +case 41: YY_RULE_SETUP -#line 479 "toke.l" +#line 489 "toke.l" { if (!fill(sudoerstext, sudoersleng)) yyterminate(); @@ -2761,9 +2783,9 @@ YY_RULE_SETUP LEXRETURN(NTWKADDR); } YY_BREAK -case 40: +case 42: YY_RULE_SETUP -#line 486 "toke.l" +#line 496 "toke.l" { if (!fill(sudoerstext, sudoersleng)) yyterminate(); @@ -2771,9 +2793,9 @@ YY_RULE_SETUP LEXRETURN(NTWKADDR); } YY_BREAK -case 41: +case 43: YY_RULE_SETUP -#line 493 "toke.l" +#line 503 "toke.l" { if (!ipv6_valid(sudoerstext)) { LEXTRACE("ERROR "); @@ -2785,9 +2807,9 @@ YY_RULE_SETUP LEXRETURN(NTWKADDR); } YY_BREAK -case 42: +case 44: YY_RULE_SETUP -#line 504 "toke.l" +#line 514 "toke.l" { if (!ipv6_valid(sudoerstext)) { LEXTRACE("ERROR "); @@ -2799,18 +2821,18 @@ YY_RULE_SETUP LEXRETURN(NTWKADDR); } YY_BREAK -case 43: +case 45: YY_RULE_SETUP -#line 515 "toke.l" +#line 525 "toke.l" { LEXTRACE("ALL "); LEXRETURN(ALL); } YY_BREAK -case 44: +case 46: YY_RULE_SETUP -#line 521 "toke.l" +#line 531 "toke.l" { #ifdef HAVE_SELINUX LEXTRACE("ROLE "); @@ -2820,9 +2842,9 @@ YY_RULE_SETUP #endif } YY_BREAK -case 45: +case 47: YY_RULE_SETUP -#line 530 "toke.l" +#line 540 "toke.l" { #ifdef HAVE_SELINUX LEXTRACE("TYPE "); @@ -2832,9 +2854,9 @@ YY_RULE_SETUP #endif } YY_BREAK -case 46: +case 48: YY_RULE_SETUP -#line 538 "toke.l" +#line 548 "toke.l" { #ifdef HAVE_PRIV_SET LEXTRACE("PRIVS "); @@ -2844,9 +2866,9 @@ YY_RULE_SETUP #endif } YY_BREAK -case 47: +case 49: YY_RULE_SETUP -#line 547 "toke.l" +#line 557 "toke.l" { #ifdef HAVE_PRIV_SET LEXTRACE("LIMITPRIVS "); @@ -2856,9 +2878,9 @@ YY_RULE_SETUP #endif } YY_BREAK -case 48: +case 50: YY_RULE_SETUP -#line 556 "toke.l" +#line 566 "toke.l" { got_alias: if (!fill(sudoerstext, sudoersleng)) @@ -2867,9 +2889,9 @@ YY_RULE_SETUP LEXRETURN(ALIAS); } YY_BREAK -case 49: +case 51: YY_RULE_SETUP -#line 564 "toke.l" +#line 574 "toke.l" { /* XXX - no way to specify digest for command */ /* no command args allowed for Defaults!/path */ @@ -2879,9 +2901,9 @@ YY_RULE_SETUP LEXRETURN(COMMAND); } YY_BREAK -case 50: +case 52: YY_RULE_SETUP -#line 573 "toke.l" +#line 583 "toke.l" { digest_len = SHA224_DIGEST_LENGTH; BEGIN WANTDIGEST; @@ -2889,9 +2911,9 @@ YY_RULE_SETUP LEXRETURN(SHA224_TOK); } YY_BREAK -case 51: +case 53: YY_RULE_SETUP -#line 580 "toke.l" +#line 590 "toke.l" { digest_len = SHA256_DIGEST_LENGTH; BEGIN WANTDIGEST; @@ -2899,9 +2921,9 @@ YY_RULE_SETUP LEXRETURN(SHA256_TOK); } YY_BREAK -case 52: +case 54: YY_RULE_SETUP -#line 587 "toke.l" +#line 597 "toke.l" { digest_len = SHA384_DIGEST_LENGTH; BEGIN WANTDIGEST; @@ -2909,9 +2931,9 @@ YY_RULE_SETUP LEXRETURN(SHA384_TOK); } YY_BREAK -case 53: +case 55: YY_RULE_SETUP -#line 594 "toke.l" +#line 604 "toke.l" { digest_len = SHA512_DIGEST_LENGTH; BEGIN WANTDIGEST; @@ -2919,9 +2941,9 @@ YY_RULE_SETUP LEXRETURN(SHA512_TOK); } YY_BREAK -case 54: +case 56: YY_RULE_SETUP -#line 601 "toke.l" +#line 611 "toke.l" { BEGIN GOTCMND; LEXTRACE("COMMAND "); @@ -2929,9 +2951,9 @@ YY_RULE_SETUP yyterminate(); } /* sudo -e */ YY_BREAK -case 55: +case 57: YY_RULE_SETUP -#line 608 "toke.l" +#line 618 "toke.l" { /* directories can't have args... */ if (sudoerstext[sudoersleng - 1] == '/') { @@ -2947,9 +2969,9 @@ YY_RULE_SETUP } } /* a pathname */ YY_BREAK -case 56: +case 58: YY_RULE_SETUP -#line 623 "toke.l" +#line 633 "toke.l" { LEXTRACE("BEGINSTR "); sudoerslval.string = NULL; @@ -2957,9 +2979,9 @@ YY_RULE_SETUP BEGIN INSTR; } YY_BREAK -case 57: +case 59: YY_RULE_SETUP -#line 630 "toke.l" +#line 640 "toke.l" { /* a word */ if (!fill(sudoerstext, sudoersleng)) @@ -2968,49 +2990,49 @@ YY_RULE_SETUP LEXRETURN(WORD); } YY_BREAK -case 58: +case 60: YY_RULE_SETUP -#line 638 "toke.l" +#line 648 "toke.l" { LEXTRACE("( "); LEXRETURN('('); } YY_BREAK -case 59: +case 61: YY_RULE_SETUP -#line 643 "toke.l" +#line 653 "toke.l" { LEXTRACE(") "); LEXRETURN(')'); } YY_BREAK -case 60: +case 62: YY_RULE_SETUP -#line 648 "toke.l" +#line 658 "toke.l" { LEXTRACE(", "); LEXRETURN(','); } /* return ',' */ YY_BREAK -case 61: +case 63: YY_RULE_SETUP -#line 653 "toke.l" +#line 663 "toke.l" { LEXTRACE("= "); LEXRETURN('='); } /* return '=' */ YY_BREAK -case 62: +case 64: YY_RULE_SETUP -#line 658 "toke.l" +#line 668 "toke.l" { LEXTRACE(": "); LEXRETURN(':'); } /* return ':' */ YY_BREAK -case 63: +case 65: YY_RULE_SETUP -#line 663 "toke.l" +#line 673 "toke.l" { if (sudoersleng & 1) { LEXTRACE("!"); @@ -3018,9 +3040,9 @@ YY_RULE_SETUP } } YY_BREAK -case 64: +case 66: YY_RULE_SETUP -#line 670 "toke.l" +#line 680 "toke.l" { if (YY_START == INSTR) { LEXTRACE("ERROR "); @@ -3033,25 +3055,25 @@ YY_RULE_SETUP LEXRETURN(COMMENT); } /* return newline */ YY_BREAK -case 65: +case 67: YY_RULE_SETUP -#line 682 "toke.l" +#line 692 "toke.l" { /* throw away space/tabs */ sawspace = true; /* but remember for fill_args */ } YY_BREAK -case 66: +case 68: YY_RULE_SETUP -#line 686 "toke.l" +#line 696 "toke.l" { sawspace = true; /* remember for fill_args */ sudolineno++; continued = true; } /* throw away EOL after \ */ YY_BREAK -case 67: +case 69: YY_RULE_SETUP -#line 692 "toke.l" +#line 702 "toke.l" { if (sudoerstext[sudoersleng - 1] == '\n') { /* comment ending in a newline */ @@ -3066,9 +3088,9 @@ YY_RULE_SETUP LEXRETURN(COMMENT); } /* comment, not uid/gid */ YY_BREAK -case 68: +case 70: YY_RULE_SETUP -#line 706 "toke.l" +#line 716 "toke.l" { LEXTRACE("ERROR "); LEXRETURN(ERROR); @@ -3081,7 +3103,7 @@ case YY_STATE_EOF(STARTDEFS): case YY_STATE_EOF(INDEFS): case YY_STATE_EOF(INSTR): case YY_STATE_EOF(WANTDIGEST): -#line 711 "toke.l" +#line 721 "toke.l" { if (YY_START != INITIAL) { BEGIN INITIAL; @@ -3092,12 +3114,12 @@ case YY_STATE_EOF(WANTDIGEST): yyterminate(); } YY_BREAK -case 69: +case 71: YY_RULE_SETUP -#line 721 "toke.l" +#line 731 "toke.l" ECHO; YY_BREAK -#line 3100 "lex.sudoers.c" +#line 3122 "lex.sudoers.c" case YY_END_OF_BUFFER: { @@ -3388,7 +3410,7 @@ static yy_state_type yy_get_previous_state YY_PROTO(( void )) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 834 ) + if ( yy_current_state >= 862 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -3423,11 +3445,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 834 ) + if ( yy_current_state >= 862 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 833); + yy_is_jam = (yy_current_state == 861); return yy_is_jam ? 0 : yy_current_state; } @@ -3988,7 +4010,7 @@ int main() return 0; } #endif -#line 721 "toke.l" +#line 731 "toke.l" struct path_list { SLIST_ENTRY(path_list) entries; diff --git a/plugins/sudoers/toke.l b/plugins/sudoers/toke.l index 93b4ac695..000660a86 100644 --- a/plugins/sudoers/toke.l +++ b/plugins/sudoers/toke.l @@ -454,6 +454,16 @@ NOMAIL[[:blank:]]*: { LEXRETURN(NOMAIL); } +FOLLOW[[:blank:]]*: { + LEXTRACE("FOLLOW "); + LEXRETURN(FOLLOW); + } + +NOFOLLOW[[:blank:]]*: { + LEXTRACE("NOFOLLOW "); + LEXRETURN(NOFOLLOW); + } + (\+|\%|\%:) { /* empty group or netgroup */ LEXTRACE("ERROR "); diff --git a/plugins/sudoers/visudo_json.c b/plugins/sudoers/visudo_json.c index 9ae2751e0..200852fa7 100644 --- a/plugins/sudoers/visudo_json.c +++ b/plugins/sudoers/visudo_json.c @@ -667,7 +667,7 @@ print_defaults_json(FILE *fp, int indent, bool need_comma) if (type == -1) { sudo_warnx(U_("unknown defaults entry `%s'"), def->var); /* XXX - just pass it through as a string anyway? */ - break;; + break; } fputs(",\n", fp); } @@ -738,23 +738,6 @@ print_aliases_json(FILE *fp, int indent, bool need_comma) debug_return_bool(need_comma); } -/* XXX these are all duplicated w/ parse.c */ -#define RUNAS_CHANGED(cs1, cs2) \ - (cs1 == NULL || cs2 == NULL || \ - cs1->runasuserlist != cs2->runasuserlist || \ - cs1->runasgrouplist != cs2->runasgrouplist) - -#define TAG_SET(tt) \ - ((tt) != UNSPEC && (tt) != IMPLIED) - -#define TAGS_CHANGED(ot, nt) \ - ((TAG_SET((nt).log_input) && (nt).log_input != (ot).log_input) || \ - (TAG_SET((nt).log_output) && (nt).log_output != (ot).log_output) || \ - (TAG_SET((nt).noexec) && (nt).noexec != (ot).noexec) || \ - (TAG_SET((nt).nopasswd) && (nt).nopasswd != (ot).nopasswd) || \ - (TAG_SET((nt).setenv) && (nt).setenv != (ot).setenv) || \ - (TAG_SET((nt).send_mail) && (nt).send_mail != (ot).send_mail)) - /* * Print a Cmnd_Spec in JSON format at the specified indent level. * A pointer to the next Cmnd_Spec is passed in to make it possible to @@ -799,56 +782,59 @@ print_cmndspec_json(FILE *fp, struct cmndspec *cs, struct cmndspec **nextp, } /* Print tags */ - if (cs->tags.log_input != UNSPEC || cs->tags.log_output != UNSPEC || - cs->tags.noexec != UNSPEC || cs->tags.nopasswd != UNSPEC || - cs->tags.send_mail != UNSPEC || cs->tags.setenv != UNSPEC) { + if (TAGS_SET(cs->tags)) { + struct cmndtag tag = cs->tags; + fprintf(fp, "%*s\"Options\": [\n", indent, ""); indent += 4; - if (cs->tags.nopasswd != UNSPEC) { + if (tag.nopasswd != UNSPEC) { value.type = JSON_BOOL; - value.u.boolean = !cs->tags.nopasswd; - last_one = cs->tags.noexec == UNSPEC && - cs->tags.send_mail == UNSPEC && cs->tags.setenv == UNSPEC && - cs->tags.log_input == UNSPEC && cs->tags.log_output == UNSPEC; + value.u.boolean = !tag.nopasswd; + tag.nopasswd = UNSPEC; print_pair_json(fp, "{ ", "authenticate", &value, - last_one ? " }\n" : " },\n", indent); + TAGS_SET(tag) ? " },\n" : " }\n", indent); } - if (cs->tags.noexec != UNSPEC) { + if (tag.noexec != UNSPEC) { value.type = JSON_BOOL; - value.u.boolean = cs->tags.noexec; - last_one = cs->tags.send_mail == UNSPEC && - cs->tags.setenv == UNSPEC && cs->tags.log_input == UNSPEC && - cs->tags.log_output == UNSPEC; + value.u.boolean = tag.noexec; + tag.noexec = UNSPEC; print_pair_json(fp, "{ ", "noexec", &value, - last_one ? " }\n" : " },\n", indent); + TAGS_SET(tag) ? " },\n" : " }\n", indent); } - if (cs->tags.send_mail != UNSPEC) { + if (tag.send_mail != UNSPEC) { value.type = JSON_BOOL; - value.u.boolean = cs->tags.send_mail; - last_one = cs->tags.setenv == UNSPEC && - cs->tags.log_input == UNSPEC && cs->tags.log_output == UNSPEC; + value.u.boolean = tag.send_mail; + tag.send_mail = UNSPEC; print_pair_json(fp, "{ ", "send_mail", &value, - last_one ? " }\n" : " },\n", indent); + TAGS_SET(tag) ? " },\n" : " }\n", indent); } - if (cs->tags.setenv != UNSPEC) { + if (tag.setenv != UNSPEC) { value.type = JSON_BOOL; - value.u.boolean = cs->tags.setenv; - last_one = cs->tags.log_input == UNSPEC && - cs->tags.log_output == UNSPEC; + value.u.boolean = tag.setenv; + tag.setenv = UNSPEC; print_pair_json(fp, "{ ", "setenv", &value, - last_one ? " }\n" : " },\n", indent); + TAGS_SET(tag) ? " },\n" : " }\n", indent); + } + if (tag.follow != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.follow; + tag.follow = UNSPEC; + print_pair_json(fp, "{ ", "sudoedit_follow", &value, + TAGS_SET(tag) ? " },\n" : " }\n", indent); } - if (cs->tags.log_input != UNSPEC) { + if (tag.log_input != UNSPEC) { value.type = JSON_BOOL; - value.u.boolean = cs->tags.log_input; - last_one = cs->tags.log_output == UNSPEC; + value.u.boolean = tag.log_input; + tag.log_input = UNSPEC; print_pair_json(fp, "{ ", "log_input", &value, - last_one ? " }\n" : " },\n", indent); + TAGS_SET(tag) ? " },\n" : " }\n", indent); } - if (cs->tags.log_output != UNSPEC) { + if (tag.log_output != UNSPEC) { value.type = JSON_BOOL; - value.u.boolean = cs->tags.log_output; - print_pair_json(fp, "{ ", "log_output", &value, " }\n", indent); + value.u.boolean = tag.log_output; + tag.log_output = UNSPEC; + print_pair_json(fp, "{ ", "log_output", &value, + TAGS_SET(tag) ? " },\n" : " }\n", indent); } indent -= 4; fprintf(fp, "%*s],\n", indent, ""); diff --git a/src/sesh.c b/src/sesh.c index 89e8f7c26..dbf2dcdc0 100644 --- a/src/sesh.c +++ b/src/sesh.c @@ -120,13 +120,20 @@ static int sesh_sudoedit(int argc, char *argv[]) { int i, oflags_dst, post, ret = SESH_ERR_FAILURE; - int fd_src = -1, fd_dst = -1; + int fd_src = -1, fd_dst = -1, follow = 0; ssize_t nread, nwritten; struct stat sb; struct timespec times[2]; char buf[BUFSIZ]; debug_decl(sesh_sudoedit, SUDO_DEBUG_EDIT) + /* Check for -h flag (don't follow links). */ + if (strcmp(argv[2], "-h") == 0) { + argv++; + argc--; + follow = O_NOFOLLOW; + } + if (argc < 3) debug_return_int(SESH_ERR_FAILURE); @@ -160,7 +167,7 @@ sesh_sudoedit(int argc, char *argv[]) * so that it's ensured that the temporary files are * created by us and that we are not opening any symlinks. */ - oflags_dst = O_WRONLY|O_TRUNC|O_CREAT|(post ? 0 : O_EXCL); + oflags_dst = O_WRONLY|O_TRUNC|O_CREAT|(post ? follow : O_EXCL); for (i = 0; i < argc - 1; i += 2) { const char *path_src = argv[i]; const char *path_dst = argv[i + 1]; @@ -169,7 +176,7 @@ sesh_sudoedit(int argc, char *argv[]) * doesn't exist, that's OK, we'll create an empty * destination file. */ - if ((fd_src = open(path_src, O_RDONLY, 0600)) < 0) { + if ((fd_src = open(path_src, O_RDONLY|follow, 0600)) < 0) { if (errno != ENOENT) { sudo_warn("%s", path_src); if (post) { diff --git a/src/sudo.c b/src/sudo.c index 3e35df150..bfda114e1 100644 --- a/src/sudo.c +++ b/src/sudo.c @@ -715,6 +715,11 @@ command_info_to_details(char * const info[], struct command_details *details) SET(details->flags, CD_SUDOEDIT); break; } + if (strncmp("sudoedit_follow=", info[i], sizeof("sudoedit_follow=") - 1) == 0) { + if (sudo_strtobool(info[i] + sizeof("sudoedit_follow=") - 1) == true) + SET(details->flags, CD_SUDOEDIT_FOLLOW); + break; + } break; case 't': if (strncmp("timeout=", info[i], sizeof("timeout=") - 1) == 0) { diff --git a/src/sudo.h b/src/sudo.h index 83f3c73a2..4536845c6 100644 --- a/src/sudo.h +++ b/src/sudo.h @@ -111,22 +111,23 @@ struct user_details { int ts_lines; }; -#define CD_SET_UID 0x0001 -#define CD_SET_EUID 0x0002 -#define CD_SET_GID 0x0004 -#define CD_SET_EGID 0x0008 -#define CD_PRESERVE_GROUPS 0x0010 -#define CD_NOEXEC 0x0020 -#define CD_SET_PRIORITY 0x0040 -#define CD_SET_UMASK 0x0080 -#define CD_SET_TIMEOUT 0x0100 -#define CD_SUDOEDIT 0x0200 -#define CD_BACKGROUND 0x0400 -#define CD_RBAC_ENABLED 0x0800 -#define CD_USE_PTY 0x1000 -#define CD_SET_UTMP 0x2000 -#define CD_EXEC_BG 0x4000 -#define CD_SUDOEDIT_COPY 0x8000 +#define CD_SET_UID 0x00001 +#define CD_SET_EUID 0x00002 +#define CD_SET_GID 0x00004 +#define CD_SET_EGID 0x00008 +#define CD_PRESERVE_GROUPS 0x00010 +#define CD_NOEXEC 0x00020 +#define CD_SET_PRIORITY 0x00040 +#define CD_SET_UMASK 0x00080 +#define CD_SET_TIMEOUT 0x00100 +#define CD_SUDOEDIT 0x00200 +#define CD_BACKGROUND 0x00400 +#define CD_RBAC_ENABLED 0x00800 +#define CD_USE_PTY 0x01000 +#define CD_SET_UTMP 0x02000 +#define CD_EXEC_BG 0x04000 +#define CD_SUDOEDIT_COPY 0x08000 +#define CD_SUDOEDIT_FOLLOW 0x10000 struct preserved_fd { TAILQ_ENTRY(preserved_fd) entries; diff --git a/src/sudo_edit.c b/src/sudo_edit.c index 66460b060..0df6890e0 100644 --- a/src/sudo_edit.c +++ b/src/sudo_edit.c @@ -57,8 +57,8 @@ struct tempfile { char *tfile; char *ofile; - struct timespec omtim; off_t osize; + struct timespec omtim; }; static char edit_tmpdir[MAX(sizeof(_PATH_VARTMP), sizeof(_PATH_TMP))]; @@ -157,6 +157,50 @@ sudo_edit_mktemp(const char *ofile, char **tfile) debug_return_int(tfd); } +#ifdef O_NOFOLLOW +static int +sudo_edit_open(const char *path, int oflags, mode_t mode, int sflags) +{ + if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW)) + oflags |= O_NOFOLLOW; + return open(path, oflags, mode); +} +#else +static int +sudo_edit_open(const char *path, int oflags, mode_t mode, int sflags) +{ + struct stat sb1, sb2; + int fd; + + fd = open(path, oflags, mode); + if (fd == -1 || ISSET(sflags, CD_SUDOEDIT_FOLLOW)) + return fd; + + /* + * Treat [fl]stat() failure like an open() failure. + */ + if (fstat(fd, &sb1) == -1 || lstat(path, &sb2) == -1) { + const int serrno = errno; + close(fd); + errno = serrno; + return -1; + } + + /* + * Make sure we did not open a link and that what we opened + * matches what is currently on the file system. + */ + if (S_ISLNK(sb2.st_mode) || + sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino) { + close(fd); + errno = ELOOP; + return -1; + } + + return fd; +} +#endif /* O_NOFOLLOW */ + /* * Create temporary copies of files[] and store the temporary path name * along with the original name, size and mtime in tf. @@ -182,7 +226,8 @@ sudo_edit_create_tfiles(struct command_details *command_details, rc = -1; switch_user(command_details->euid, command_details->egid, command_details->ngroups, command_details->groups); - if ((ofd = open(files[i], O_RDONLY, 0644)) != -1 || errno == ENOENT) { + ofd = sudo_edit_open(files[i], O_RDONLY, 0644, command_details->flags); + if (ofd != -1 || errno == ENOENT) { if (ofd == -1) { memset(&sb, 0, sizeof(sb)); /* new file */ rc = 0; @@ -192,11 +237,17 @@ sudo_edit_create_tfiles(struct command_details *command_details, } switch_user(ROOT_UID, user_details.egid, user_details.ngroups, user_details.groups); - if (rc || (ofd != -1 && !S_ISREG(sb.st_mode))) { - if (rc) - sudo_warn("%s", files[i]); + if (ofd != -1 && !S_ISREG(sb.st_mode)) { + sudo_warnx(U_("%s: not a regular file"), files[i]); + close(ofd); + continue; + } + if (rc == -1) { + /* open() or fstat() error. */ + if (ofd == -1 && errno == ELOOP) + sudo_warnx(U_("%s: is a symbolic link"), files[i]); else - sudo_warnx(U_("%s: not a regular file"), files[i]); + sudo_warn("%s", files[i]); if (ofd != -1) close(ofd); continue; @@ -275,9 +326,9 @@ sudo_edit_copy_tfiles(struct command_details *command_details, "seteuid(%u)", user_details.uid); if (seteuid(user_details.uid) != 0) sudo_fatal("seteuid(%d)", (int)user_details.uid); - if ((tfd = open(tf[i].tfile, O_RDONLY, 0644)) != -1) { + tfd = sudo_edit_open(tf[i].tfile, O_RDONLY, 0644, 0); + if (tfd != -1) rc = fstat(tfd, &sb); - } sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, "seteuid(%u)", ROOT_UID); if (seteuid(ROOT_UID) != 0) @@ -309,7 +360,8 @@ sudo_edit_copy_tfiles(struct command_details *command_details, } switch_user(command_details->euid, command_details->egid, command_details->ngroups, command_details->groups); - ofd = open(tf[i].ofile, O_WRONLY|O_TRUNC|O_CREAT, 0644); + ofd = sudo_edit_open(tf[i].ofile, O_WRONLY|O_TRUNC|O_CREAT, 0644, + command_details->flags); switch_user(ROOT_UID, user_details.egid, user_details.ngroups, user_details.groups); if (ofd == -1) { @@ -368,7 +420,7 @@ selinux_edit_create_tfiles(struct command_details *command_details, command_details->command = _PATH_SUDO_SESH; command_details->flags |= CD_SUDOEDIT_COPY; - sesh_nargs = 3 + (nfiles * 2) + 1; + sesh_nargs = 4 + (nfiles * 2) + 1; sesh_args = sesh_ap = reallocarray(NULL, sesh_nargs, sizeof(char *)); if (sesh_args == NULL) { sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); @@ -376,6 +428,8 @@ selinux_edit_create_tfiles(struct command_details *command_details, } *sesh_ap++ = "sesh"; *sesh_ap++ = "-e"; + if (!ISSET(command_details->flags, CD_SUDOEDIT_FOLLOW)) + *sesh_ap++ = "-h"; *sesh_ap++ = "0"; for (i = 0; i < nfiles; i++) { @@ -406,7 +460,7 @@ selinux_edit_create_tfiles(struct command_details *command_details, } *sesh_ap = NULL; - /* Run sesh -e 0 ... */ + /* Run sesh -e [-h] 0 ... */ command_details->argv = sesh_args; rc = run_command(command_details); switch (rc) { -- 2.40.0