Deleted Added
full compact
command.c (49978) command.c (50059)
1/*
2 * PPP User command processing module
3 *
4 * Written by Toshiharu OHNO (tony-o@iij.ad.jp)
5 *
6 * Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
7 *
8 * Redistribution and use in source and binary forms are permitted
9 * provided that the above copyright notice and this paragraph are
10 * duplicated in all such forms and that any documentation,
11 * advertising materials, and other materials related to such
12 * distribution and use acknowledge that the software was developed
13 * by the Internet Initiative Japan, Inc. The name of the
14 * IIJ may not be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19 *
1/*
2 * PPP User command processing module
3 *
4 * Written by Toshiharu OHNO (tony-o@iij.ad.jp)
5 *
6 * Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
7 *
8 * Redistribution and use in source and binary forms are permitted
9 * provided that the above copyright notice and this paragraph are
10 * duplicated in all such forms and that any documentation,
11 * advertising materials, and other materials related to such
12 * distribution and use acknowledge that the software was developed
13 * by the Internet Initiative Japan, Inc. The name of the
14 * IIJ may not be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19 *
20 * $Id: command.c,v 1.206 1999/08/17 14:59:05 brian Exp $
20 * $Id: command.c,v 1.207 1999/08/17 17:22:44 brian Exp $
21 *
22 */
23#include <sys/param.h>
24#include <netinet/in_systm.h>
25#include <netinet/in.h>
26#include <netinet/ip.h>
27#include <arpa/inet.h>
28#include <sys/socket.h>

--- 7 unchanged lines hidden (view full) ---

36#include <paths.h>
37#include <stdio.h>
38#include <stdlib.h>
39#include <string.h>
40#include <sys/wait.h>
41#include <termios.h>
42#include <unistd.h>
43
21 *
22 */
23#include <sys/param.h>
24#include <netinet/in_systm.h>
25#include <netinet/in.h>
26#include <netinet/ip.h>
27#include <arpa/inet.h>
28#include <sys/socket.h>

--- 7 unchanged lines hidden (view full) ---

36#include <paths.h>
37#include <stdio.h>
38#include <stdlib.h>
39#include <string.h>
40#include <sys/wait.h>
41#include <termios.h>
42#include <unistd.h>
43
44#ifndef NOALIAS
44#ifndef NONAT
45#ifdef __FreeBSD__
46#include <alias.h>
47#else
48#include "alias.h"
49#endif
50#endif
51#include "layer.h"
52#include "defs.h"

--- 4 unchanged lines hidden (view full) ---

57#include "fsm.h"
58#include "lcp.h"
59#include "iplist.h"
60#include "throughput.h"
61#include "slcompress.h"
62#include "lqr.h"
63#include "hdlc.h"
64#include "ipcp.h"
45#ifdef __FreeBSD__
46#include <alias.h>
47#else
48#include "alias.h"
49#endif
50#endif
51#include "layer.h"
52#include "defs.h"

--- 4 unchanged lines hidden (view full) ---

57#include "fsm.h"
58#include "lcp.h"
59#include "iplist.h"
60#include "throughput.h"
61#include "slcompress.h"
62#include "lqr.h"
63#include "hdlc.h"
64#include "ipcp.h"
65#ifndef NOALIAS
65#ifndef NONAT
66#include "alias_cmd.h"
67#endif
68#include "systems.h"
69#include "filter.h"
70#include "descriptor.h"
71#include "main.h"
72#include "route.h"
73#include "ccp.h"

--- 65 unchanged lines hidden (view full) ---

139#define NEG_PAP 48
140#define NEG_PPPDDEFLATE 49
141#define NEG_PRED1 50
142#define NEG_PROTOCOMP 51
143#define NEG_SHORTSEQ 52
144#define NEG_VJCOMP 53
145
146const char Version[] = "2.23";
66#include "alias_cmd.h"
67#endif
68#include "systems.h"
69#include "filter.h"
70#include "descriptor.h"
71#include "main.h"
72#include "route.h"
73#include "ccp.h"

--- 65 unchanged lines hidden (view full) ---

139#define NEG_PAP 48
140#define NEG_PPPDDEFLATE 49
141#define NEG_PRED1 50
142#define NEG_PROTOCOMP 51
143#define NEG_SHORTSEQ 52
144#define NEG_VJCOMP 53
145
146const char Version[] = "2.23";
147const char VersionDate[] = "$Date: 1999/08/17 14:59:05 $";
147const char VersionDate[] = "$Date: 1999/08/17 17:22:44 $";
148
149static int ShowCommand(struct cmdargs const *);
150static int TerminalCommand(struct cmdargs const *);
151static int QuitCommand(struct cmdargs const *);
152static int OpenCommand(struct cmdargs const *);
153static int CloseCommand(struct cmdargs const *);
154static int DownCommand(struct cmdargs const *);
155static int SetCommand(struct cmdargs const *);
156static int LinkCommand(struct cmdargs const *);
157static int AddCommand(struct cmdargs const *);
158static int DeleteCommand(struct cmdargs const *);
159static int NegotiateCommand(struct cmdargs const *);
160static int ClearCommand(struct cmdargs const *);
161static int RunListCommand(struct cmdargs const *);
162static int IfaceAddCommand(struct cmdargs const *);
163static int IfaceDeleteCommand(struct cmdargs const *);
164static int IfaceClearCommand(struct cmdargs const *);
165static int SetProcTitle(struct cmdargs const *);
148
149static int ShowCommand(struct cmdargs const *);
150static int TerminalCommand(struct cmdargs const *);
151static int QuitCommand(struct cmdargs const *);
152static int OpenCommand(struct cmdargs const *);
153static int CloseCommand(struct cmdargs const *);
154static int DownCommand(struct cmdargs const *);
155static int SetCommand(struct cmdargs const *);
156static int LinkCommand(struct cmdargs const *);
157static int AddCommand(struct cmdargs const *);
158static int DeleteCommand(struct cmdargs const *);
159static int NegotiateCommand(struct cmdargs const *);
160static int ClearCommand(struct cmdargs const *);
161static int RunListCommand(struct cmdargs const *);
162static int IfaceAddCommand(struct cmdargs const *);
163static int IfaceDeleteCommand(struct cmdargs const *);
164static int IfaceClearCommand(struct cmdargs const *);
165static int SetProcTitle(struct cmdargs const *);
166#ifndef NOALIAS
166#ifndef NONAT
167static int AliasEnable(struct cmdargs const *);
168static int AliasOption(struct cmdargs const *);
169#endif
170
171static const char *
172showcx(struct cmdtab const *cmd)
173{
174 if (cmd->lauth & LOCAL_CX)

--- 366 unchanged lines hidden (view full) ---

541}
542
543static int
544FgShellCommand(struct cmdargs const *arg)
545{
546 return ShellCommand(arg, 0);
547}
548
167static int AliasEnable(struct cmdargs const *);
168static int AliasOption(struct cmdargs const *);
169#endif
170
171static const char *
172showcx(struct cmdtab const *cmd)
173{
174 if (cmd->lauth & LOCAL_CX)

--- 366 unchanged lines hidden (view full) ---

541}
542
543static int
544FgShellCommand(struct cmdargs const *arg)
545{
546 return ShellCommand(arg, 0);
547}
548
549#ifndef NOALIAS
549#ifndef NONAT
550static struct cmdtab const AliasCommands[] =
551{
550static struct cmdtab const AliasCommands[] =
551{
552 {"addr", NULL, alias_RedirectAddr, LOCAL_AUTH,
553 "static address translation", "alias addr [addr_local addr_alias]"},
552 {"addr", NULL, nat_RedirectAddr, LOCAL_AUTH,
553 "static address translation", "nat addr [addr_local addr_alias]"},
554 {"deny_incoming", NULL, AliasOption, LOCAL_AUTH,
554 {"deny_incoming", NULL, AliasOption, LOCAL_AUTH,
555 "stop incoming connections", "alias deny_incoming [yes|no]",
555 "stop incoming connections", "nat deny_incoming yes|no",
556 (const void *) PKT_ALIAS_DENY_INCOMING},
557 {"enable", NULL, AliasEnable, LOCAL_AUTH,
556 (const void *) PKT_ALIAS_DENY_INCOMING},
557 {"enable", NULL, AliasEnable, LOCAL_AUTH,
558 "enable IP aliasing", "alias enable [yes|no]"},
558 "enable NAT", "nat enable yes|no"},
559 {"log", NULL, AliasOption, LOCAL_AUTH,
559 {"log", NULL, AliasOption, LOCAL_AUTH,
560 "log aliasing link creation", "alias log [yes|no]",
560 "log NAT link creation", "nat log yes|no",
561 (const void *) PKT_ALIAS_LOG},
561 (const void *) PKT_ALIAS_LOG},
562 {"port", NULL, alias_RedirectPort, LOCAL_AUTH, "port redirection",
563 "alias port proto localaddr:port[-port] aliasport[-aliasport]"},
564 {"pptp", NULL, alias_Pptp, LOCAL_AUTH,
565 "Set the PPTP address", "alias pptp IP"},
566 {"proxy", NULL, alias_ProxyRule, LOCAL_AUTH,
567 "proxy control", "alias proxy server host[:port] ..."},
562 {"port", NULL, nat_RedirectPort, LOCAL_AUTH, "port redirection",
563 "nat port proto localaddr:port[-port] aliasport[-aliasport]"},
564 {"pptp", NULL, nat_Pptp, LOCAL_AUTH,
565 "Set the PPTP address", "nat pptp IP"},
566 {"proxy", NULL, nat_ProxyRule, LOCAL_AUTH,
567 "proxy control", "nat proxy server host[:port] ..."},
568 {"same_ports", NULL, AliasOption, LOCAL_AUTH,
568 {"same_ports", NULL, AliasOption, LOCAL_AUTH,
569 "try to leave port numbers unchanged", "alias same_ports [yes|no]",
569 "try to leave port numbers unchanged", "nat same_ports yes|no",
570 (const void *) PKT_ALIAS_SAME_PORTS},
571 {"unregistered_only", NULL, AliasOption, LOCAL_AUTH,
570 (const void *) PKT_ALIAS_SAME_PORTS},
571 {"unregistered_only", NULL, AliasOption, LOCAL_AUTH,
572 "alias unregistered (private) IP address space only",
573 "alias unregistered_only [yes|no]",
572 "translate unregistered (private) IP address space only",
573 "nat unregistered_only yes|no",
574 (const void *) PKT_ALIAS_UNREGISTERED_ONLY},
575 {"use_sockets", NULL, AliasOption, LOCAL_AUTH,
574 (const void *) PKT_ALIAS_UNREGISTERED_ONLY},
575 {"use_sockets", NULL, AliasOption, LOCAL_AUTH,
576 "allocate host sockets", "alias use_sockets [yes|no]",
576 "allocate host sockets", "nat use_sockets yes|no",
577 (const void *) PKT_ALIAS_USE_SOCKETS},
578 {"help", "?", HelpCommand, LOCAL_AUTH | LOCAL_NO_AUTH,
577 (const void *) PKT_ALIAS_USE_SOCKETS},
578 {"help", "?", HelpCommand, LOCAL_AUTH | LOCAL_NO_AUTH,
579 "Display this message", "alias help|? [command]", AliasCommands},
579 "Display this message", "nat help|? [command]", AliasCommands},
580 {NULL, NULL, NULL},
581};
582#endif
583
584static struct cmdtab const AllowCommands[] = {
585 {"modes", "mode", AllowModes, LOCAL_AUTH,
586 "Only allow certain ppp modes", "allow modes mode..."},
587 {"users", "user", AllowUsers, LOCAL_AUTH,

--- 16 unchanged lines hidden (view full) ---

604 "Delete iface address", "iface delete addr", NULL},
605 {NULL, "rm!", IfaceDeleteCommand, LOCAL_AUTH,
606 "Delete iface address", "iface delete addr", (void *)1},
607 {NULL, "delete!", IfaceDeleteCommand, LOCAL_AUTH,
608 "Delete iface address", "iface delete addr", (void *)1},
609 {"show", NULL, iface_Show, LOCAL_AUTH,
610 "Show iface address(es)", "iface show"},
611 {"help", "?", HelpCommand, LOCAL_AUTH | LOCAL_NO_AUTH,
580 {NULL, NULL, NULL},
581};
582#endif
583
584static struct cmdtab const AllowCommands[] = {
585 {"modes", "mode", AllowModes, LOCAL_AUTH,
586 "Only allow certain ppp modes", "allow modes mode..."},
587 {"users", "user", AllowUsers, LOCAL_AUTH,

--- 16 unchanged lines hidden (view full) ---

604 "Delete iface address", "iface delete addr", NULL},
605 {NULL, "rm!", IfaceDeleteCommand, LOCAL_AUTH,
606 "Delete iface address", "iface delete addr", (void *)1},
607 {NULL, "delete!", IfaceDeleteCommand, LOCAL_AUTH,
608 "Delete iface address", "iface delete addr", (void *)1},
609 {"show", NULL, iface_Show, LOCAL_AUTH,
610 "Show iface address(es)", "iface show"},
611 {"help", "?", HelpCommand, LOCAL_AUTH | LOCAL_NO_AUTH,
612 "Display this message", "alias help|? [command]", IfaceCommands},
612 "Display this message", "nat help|? [command]", IfaceCommands},
613 {NULL, NULL, NULL},
614};
615
616static struct cmdtab const Commands[] = {
617 {"accept", NULL, NegotiateCommand, LOCAL_AUTH | LOCAL_CX_OPT,
618 "accept option request", "accept option .."},
619 {"add", NULL, AddCommand, LOCAL_AUTH,
620 "add route", "add dest mask gateway", NULL},
621 {NULL, "add!", AddCommand, LOCAL_AUTH,
622 "add or change route", "add! dest mask gateway", (void *)1},
613 {NULL, NULL, NULL},
614};
615
616static struct cmdtab const Commands[] = {
617 {"accept", NULL, NegotiateCommand, LOCAL_AUTH | LOCAL_CX_OPT,
618 "accept option request", "accept option .."},
619 {"add", NULL, AddCommand, LOCAL_AUTH,
620 "add route", "add dest mask gateway", NULL},
621 {NULL, "add!", AddCommand, LOCAL_AUTH,
622 "add or change route", "add! dest mask gateway", (void *)1},
623#ifndef NOALIAS
624 {"alias", NULL, RunListCommand, LOCAL_AUTH,
625 "alias control", "alias option [yes|no]", AliasCommands},
626#endif
627 {"allow", "auth", RunListCommand, LOCAL_AUTH,
628 "Allow ppp access", "allow users|modes ....", AllowCommands},
629 {"bg", "!bg", BgShellCommand, LOCAL_AUTH,
630 "Run a background command", "[!]bg command"},
631 {"clear", NULL, ClearCommand, LOCAL_AUTH | LOCAL_CX_OPT,
632 "Clear throughput statistics",
633 "clear ipcp|physical [current|overall|peak]..."},
634 {"clone", NULL, CloneCommand, LOCAL_AUTH | LOCAL_CX,

--- 15 unchanged lines hidden (view full) ---

650 {"enable", NULL, NegotiateCommand, LOCAL_AUTH | LOCAL_CX_OPT,
651 "Enable option", "enable option .."},
652 {"iface", "interface", RunListCommand, LOCAL_AUTH,
653 "interface control", "iface option ...", IfaceCommands},
654 {"link", "datalink", LinkCommand, LOCAL_AUTH,
655 "Link specific commands", "link name command ..."},
656 {"load", NULL, LoadCommand, LOCAL_AUTH | LOCAL_CX_OPT,
657 "Load settings", "load [system ...]"},
623 {"allow", "auth", RunListCommand, LOCAL_AUTH,
624 "Allow ppp access", "allow users|modes ....", AllowCommands},
625 {"bg", "!bg", BgShellCommand, LOCAL_AUTH,
626 "Run a background command", "[!]bg command"},
627 {"clear", NULL, ClearCommand, LOCAL_AUTH | LOCAL_CX_OPT,
628 "Clear throughput statistics",
629 "clear ipcp|physical [current|overall|peak]..."},
630 {"clone", NULL, CloneCommand, LOCAL_AUTH | LOCAL_CX,

--- 15 unchanged lines hidden (view full) ---

646 {"enable", NULL, NegotiateCommand, LOCAL_AUTH | LOCAL_CX_OPT,
647 "Enable option", "enable option .."},
648 {"iface", "interface", RunListCommand, LOCAL_AUTH,
649 "interface control", "iface option ...", IfaceCommands},
650 {"link", "datalink", LinkCommand, LOCAL_AUTH,
651 "Link specific commands", "link name command ..."},
652 {"load", NULL, LoadCommand, LOCAL_AUTH | LOCAL_CX_OPT,
653 "Load settings", "load [system ...]"},
654#ifndef NONAT
655 {"nat", "alias", RunListCommand, LOCAL_AUTH,
656 "NAT control", "nat option yes|no", AliasCommands},
657#endif
658 {"open", NULL, OpenCommand, LOCAL_AUTH | LOCAL_CX_OPT,
659 "Open an FSM", "open! [lcp|ccp|ipcp]", (void *)1},
660 {"passwd", NULL, PasswdCommand, LOCAL_NO_AUTH,
661 "Password for manipulation", "passwd LocalPassword"},
662 {"quit", "bye", QuitCommand, LOCAL_AUTH | LOCAL_NO_AUTH,
663 "Quit PPP program", "quit|bye [all]"},
664 {"remove", "rm", RemoveCommand, LOCAL_AUTH | LOCAL_CX,
665 "Remove a link", "remove"},

--- 1344 unchanged lines hidden (view full) ---

2010 route_Delete(&arg->bundle->ncp.ipcp.route, addrs, dest);
2011 }
2012 } else
2013 return -1;
2014
2015 return 0;
2016}
2017
658 {"open", NULL, OpenCommand, LOCAL_AUTH | LOCAL_CX_OPT,
659 "Open an FSM", "open! [lcp|ccp|ipcp]", (void *)1},
660 {"passwd", NULL, PasswdCommand, LOCAL_NO_AUTH,
661 "Password for manipulation", "passwd LocalPassword"},
662 {"quit", "bye", QuitCommand, LOCAL_AUTH | LOCAL_NO_AUTH,
663 "Quit PPP program", "quit|bye [all]"},
664 {"remove", "rm", RemoveCommand, LOCAL_AUTH | LOCAL_CX,
665 "Remove a link", "remove"},

--- 1344 unchanged lines hidden (view full) ---

2010 route_Delete(&arg->bundle->ncp.ipcp.route, addrs, dest);
2011 }
2012 } else
2013 return -1;
2014
2015 return 0;
2016}
2017
2018#ifndef NOALIAS
2018#ifndef NONAT
2019static int
2020AliasEnable(struct cmdargs const *arg)
2021{
2022 if (arg->argc == arg->argn+1) {
2023 if (strcasecmp(arg->argv[arg->argn], "yes") == 0) {
2019static int
2020AliasEnable(struct cmdargs const *arg)
2021{
2022 if (arg->argc == arg->argn+1) {
2023 if (strcasecmp(arg->argv[arg->argn], "yes") == 0) {
2024 if (!arg->bundle->AliasEnabled) {
2024 if (!arg->bundle->NatEnabled) {
2025 if (arg->bundle->ncp.ipcp.fsm.state == ST_OPENED)
2026 PacketAliasSetAddress(arg->bundle->ncp.ipcp.my_ip);
2025 if (arg->bundle->ncp.ipcp.fsm.state == ST_OPENED)
2026 PacketAliasSetAddress(arg->bundle->ncp.ipcp.my_ip);
2027 arg->bundle->AliasEnabled = 1;
2027 arg->bundle->NatEnabled = 1;
2028 }
2029 return 0;
2030 } else if (strcasecmp(arg->argv[arg->argn], "no") == 0) {
2028 }
2029 return 0;
2030 } else if (strcasecmp(arg->argv[arg->argn], "no") == 0) {
2031 arg->bundle->AliasEnabled = 0;
2031 arg->bundle->NatEnabled = 0;
2032 arg->bundle->cfg.opt &= ~OPT_IFACEALIAS;
2033 /* Don't iface_Clear() - there may be manually configured addresses */
2034 return 0;
2035 }
2036 }
2037
2038 return -1;
2039}
2040
2041
2042static int
2043AliasOption(struct cmdargs const *arg)
2044{
2045 long param = (long)arg->cmd->args;
2046
2047 if (arg->argc == arg->argn+1) {
2048 if (strcasecmp(arg->argv[arg->argn], "yes") == 0) {
2032 arg->bundle->cfg.opt &= ~OPT_IFACEALIAS;
2033 /* Don't iface_Clear() - there may be manually configured addresses */
2034 return 0;
2035 }
2036 }
2037
2038 return -1;
2039}
2040
2041
2042static int
2043AliasOption(struct cmdargs const *arg)
2044{
2045 long param = (long)arg->cmd->args;
2046
2047 if (arg->argc == arg->argn+1) {
2048 if (strcasecmp(arg->argv[arg->argn], "yes") == 0) {
2049 if (arg->bundle->AliasEnabled) {
2049 if (arg->bundle->NatEnabled) {
2050 PacketAliasSetMode(param, param);
2051 return 0;
2052 }
2050 PacketAliasSetMode(param, param);
2051 return 0;
2052 }
2053 log_Printf(LogWARN, "alias not enabled\n");
2053 log_Printf(LogWARN, "nat not enabled\n");
2054 } else if (strcmp(arg->argv[arg->argn], "no") == 0) {
2054 } else if (strcmp(arg->argv[arg->argn], "no") == 0) {
2055 if (arg->bundle->AliasEnabled) {
2055 if (arg->bundle->NatEnabled) {
2056 PacketAliasSetMode(0, param);
2057 return 0;
2058 }
2056 PacketAliasSetMode(0, param);
2057 return 0;
2058 }
2059 log_Printf(LogWARN, "alias not enabled\n");
2059 log_Printf(LogWARN, "nat not enabled\n");
2060 }
2061 }
2062 return -1;
2063}
2060 }
2061 }
2062 return -1;
2063}
2064#endif /* #ifndef NOALIAS */
2064#endif /* #ifndef NONAT */
2065
2066static int
2067LinkCommand(struct cmdargs const *arg)
2068{
2069 if (arg->argc > arg->argn+1) {
2070 char namelist[LINE_LEN];
2071 struct datalink *cx;
2072 char *name;

--- 118 unchanged lines hidden (view full) ---

2191
2192static int
2193IfaceAliasOptSet(struct cmdargs const *arg)
2194{
2195 unsigned save = arg->bundle->cfg.opt;
2196 int result = OptSet(arg);
2197
2198 if (result == 0)
2065
2066static int
2067LinkCommand(struct cmdargs const *arg)
2068{
2069 if (arg->argc > arg->argn+1) {
2070 char namelist[LINE_LEN];
2071 struct datalink *cx;
2072 char *name;

--- 118 unchanged lines hidden (view full) ---

2191
2192static int
2193IfaceAliasOptSet(struct cmdargs const *arg)
2194{
2195 unsigned save = arg->bundle->cfg.opt;
2196 int result = OptSet(arg);
2197
2198 if (result == 0)
2199 if (Enabled(arg->bundle, OPT_IFACEALIAS) && !arg->bundle->AliasEnabled) {
2199 if (Enabled(arg->bundle, OPT_IFACEALIAS) && !arg->bundle->NatEnabled) {
2200 arg->bundle->cfg.opt = save;
2200 arg->bundle->cfg.opt = save;
2201 log_Printf(LogWARN, "Cannot enable iface-alias without IP aliasing\n");
2201 log_Printf(LogWARN, "Cannot enable iface-alias without NAT\n");
2202 result = 2;
2203 }
2204
2205 return result;
2206}
2207
2208static int
2209NegotiateSet(struct cmdargs const *arg)

--- 394 unchanged lines hidden ---
2202 result = 2;
2203 }
2204
2205 return result;
2206}
2207
2208static int
2209NegotiateSet(struct cmdargs const *arg)

--- 394 unchanged lines hidden ---