summaryrefslogtreecommitdiffstats
path: root/c/src
diff options
context:
space:
mode:
authorRalf Corsepius <ralf.corsepius@rtems.org>2005-10-26 16:41:59 +0000
committerRalf Corsepius <ralf.corsepius@rtems.org>2005-10-26 16:41:59 +0000
commit1e34f3f20cab3d81a0b7bc263fbc580a0985893e (patch)
tree840b68c94ce5e0a7cabeb61126ce151b275fa53f /c/src
parentRemove (diff)
downloadrtems-1e34f3f20cab3d81a0b7bc263fbc580a0985893e.tar.bz2
Remove (Moved to cpukit).
Diffstat (limited to '')
-rw-r--r--c/src/libnetworking/Makefile.am8
-rw-r--r--c/src/libnetworking/pppd/Makefile.am31
-rw-r--r--c/src/libnetworking/pppd/README29
-rw-r--r--c/src/libnetworking/pppd/STATUS27
-rw-r--r--c/src/libnetworking/pppd/auth.c1121
-rw-r--r--c/src/libnetworking/pppd/cbcp.c456
-rw-r--r--c/src/libnetworking/pppd/cbcp.h26
-rw-r--r--c/src/libnetworking/pppd/ccp.c1226
-rw-r--r--c/src/libnetworking/pppd/ccp.h48
-rw-r--r--c/src/libnetworking/pppd/chap.c858
-rw-r--r--c/src/libnetworking/pppd/chap.h124
-rw-r--r--c/src/libnetworking/pppd/chap_ms.c338
-rw-r--r--c/src/libnetworking/pppd/chap_ms.h33
-rw-r--r--c/src/libnetworking/pppd/chat.c857
-rw-r--r--c/src/libnetworking/pppd/demand.c347
-rw-r--r--c/src/libnetworking/pppd/example/Makefile-user45
-rw-r--r--c/src/libnetworking/pppd/example/README15
-rw-r--r--c/src/libnetworking/pppd/example/init.c24
-rw-r--r--c/src/libnetworking/pppd/example/netconfig.h36
-rw-r--r--c/src/libnetworking/pppd/example/ppp.conf27
-rw-r--r--c/src/libnetworking/pppd/example/pppd.options9
-rw-r--r--c/src/libnetworking/pppd/example/pppdapp.c146
-rw-r--r--c/src/libnetworking/pppd/example/system.h42
-rw-r--r--c/src/libnetworking/pppd/fsm.c764
-rw-r--r--c/src/libnetworking/pppd/fsm.h144
-rw-r--r--c/src/libnetworking/pppd/ipcp.c1768
-rw-r--r--c/src/libnetworking/pppd/ipcp.h73
-rw-r--r--c/src/libnetworking/pppd/ipxcp.c1449
-rw-r--r--c/src/libnetworking/pppd/ipxcp.h71
-rw-r--r--c/src/libnetworking/pppd/lcp.c1953
-rw-r--r--c/src/libnetworking/pppd/lcp.h88
-rw-r--r--c/src/libnetworking/pppd/magic.c58
-rw-r--r--c/src/libnetworking/pppd/magic.h23
-rw-r--r--c/src/libnetworking/pppd/md4.c298
-rw-r--r--c/src/libnetworking/pppd/md4.h64
-rw-r--r--c/src/libnetworking/pppd/md5.c308
-rw-r--r--c/src/libnetworking/pppd/md5.h58
-rw-r--r--c/src/libnetworking/pppd/options.c1525
-rw-r--r--c/src/libnetworking/pppd/patchlevel.h6
-rw-r--r--c/src/libnetworking/pppd/pathnames.h43
-rw-r--r--c/src/libnetworking/pppd/pppd.81480
-rw-r--r--c/src/libnetworking/pppd/pppd.h663
-rw-r--r--c/src/libnetworking/pppd/preinstall.am27
-rw-r--r--c/src/libnetworking/pppd/rtemsdialer.h24
-rw-r--r--c/src/libnetworking/pppd/rtemsmain.c896
-rw-r--r--c/src/libnetworking/pppd/rtemspppd.c217
-rw-r--r--c/src/libnetworking/pppd/rtemspppd.h29
-rw-r--r--c/src/libnetworking/pppd/sys-rtems.c1338
-rw-r--r--c/src/libnetworking/pppd/upap.c638
-rw-r--r--c/src/libnetworking/pppd/upap.h87
-rw-r--r--c/src/libnetworking/pppd/utils.c833
51 files changed, 0 insertions, 20798 deletions
diff --git a/c/src/libnetworking/Makefile.am b/c/src/libnetworking/Makefile.am
deleted file mode 100644
index 247c85953e..0000000000
--- a/c/src/libnetworking/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-##
-## $Id$
-##
-
-SUBDIRS = pppd
-
-include $(top_srcdir)/automake/subdirs.am
-include $(top_srcdir)/automake/local.am
diff --git a/c/src/libnetworking/pppd/Makefile.am b/c/src/libnetworking/pppd/Makefile.am
deleted file mode 100644
index 76411c23a1..0000000000
--- a/c/src/libnetworking/pppd/Makefile.am
+++ /dev/null
@@ -1,31 +0,0 @@
-##
-## $Id$
-##
-
-include $(top_srcdir)/automake/compile.am
-
-noinst_LIBRARIES =
-
-if HAS_NETWORKING
-include_rtemsdir = $(includedir)/rtems
-include_rtems_HEADERS = rtemspppd.h rtemsdialer.h
-
-noinst_LIBRARIES += libpppd.a
-libpppd_a_SOURCES = auth.c ccp.c ccp.h chap.c chap.h chap_ms.c chap_ms.h \
- chat.c demand.c fsm.c fsm.h ipcp.c ipcp.h lcp.c lcp.h magic.c magic.h \
- options.c upap.c upap.h md4.c md4.h md5.c md5.h utils.c sys-rtems.c \
- rtemsmain.c rtemspppd.c pppd.h patchlevel.h pathnames.h
-libpppd_a_CPPFLAGS = $(AM_CPPFLAGS) -D__BSD_VISIBLE
-endif
-
-# FIXME: Move sources to libpppd_a_SOURCES, remove other files.
-EXTRA_DIST = ipxcp.c ipxcp.h
-
-all-local: $(PREINSTALL_FILES)
-
-CLEANFILES = $(PREINSTALL_FILES)
-DISTCLEANFILES = $(PREINSTALL_DIRS)
-
-include $(srcdir)/preinstall.am
-
-include $(top_srcdir)/automake/local.am
diff --git a/c/src/libnetworking/pppd/README b/c/src/libnetworking/pppd/README
deleted file mode 100644
index 28c9f7ef5d..0000000000
--- a/c/src/libnetworking/pppd/README
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# $Id$
-#
-
-This directory contains a port of ppp-2.3.11. The official site for
-the original source for this PPP implementation is:
-
-ftp://cs.anu.edu.au/pub/software/ppp
-
-================================================================
-History
-
-The original port was of 2.3.5 by Tomasz Domin <dot@comarch.pl> of
-ComArch SA and was initially only tested on the mpc823. He
-provided the modem driver as well.
-
-The port was updated to 2.3.11 by Mike Siers <mikes@poliac.com>
-who added an example test.
-
-Updated the chat program to return the correct errors and support
-the ABORT commands. Removed some dead code and did a lot of
-testing on a new Coldfire BSP. Version seems to be very stable.
-
-Update code to use RTEMS pppd network drivers. Now the pppd
-software is not dependent on using task driven mode. This
-change improved stablity and performance. This was updated
-by Mike Siers <mikes@poliac.com>.
-=================================================================
-
diff --git a/c/src/libnetworking/pppd/STATUS b/c/src/libnetworking/pppd/STATUS
deleted file mode 100644
index 4c0d35d423..0000000000
--- a/c/src/libnetworking/pppd/STATUS
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# $Id$
-#
-
-The pppd application seems to very stable. It has been tested using
-the example application with the i386/pc586 and m68k/sbc5206e BSPs.
-The tests were executed using a null modem serial cable to connect
-with a UNIX box running either the ppp or pppd application and with
-an external modem to dial up a local ISP.
-
-If you have problems getting your target to make consistent connections
-with an ISP, the problem is most likely with the ppp options. First
-try using the "novj" and "noaccomp" options. If you have questions
-about what other option values are available for the rtems_pppd_set_option
-function, please look at the pppd.8 man page file or the the source code.
-The majority of options that are documented in man page should work
-with this function call.
-
-The pppd code had now been updated to use it's own RTEMS network
-drivers. This removes the requirement for the task driven termios
-support. This update has fixed the large packet ping problem.
-Currently, I do not know of any problems with the port.
-
-If you find any other problems or fix some problems, please post your
-changes to the RTEMS mailing list.
-
-Good Luck
diff --git a/c/src/libnetworking/pppd/auth.c b/c/src/libnetworking/pppd/auth.c
deleted file mode 100644
index a92654a650..0000000000
--- a/c/src/libnetworking/pppd/auth.c
+++ /dev/null
@@ -1,1121 +0,0 @@
-/*
- * auth.c - PPP authentication and phase control.
- *
- * Copyright (c) 1993 The Australian National University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the Australian National University. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#define RCSID "$Id$"
-
-#include <stdio.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <pwd.h>
-#include <grp.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <fcntl.h>
-#if defined(_PATH_LASTLOG) && defined(_linux_)
-#include <lastlog.h>
-#endif
-
-#include <netdb.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#ifdef USE_PAM
-#include <security/pam_appl.h>
-#endif
-
-#ifdef HAS_SHADOW
-#include <shadow.h>
-#ifndef PW_PPP
-#define PW_PPP PW_LOGIN
-#endif
-#endif
-
-#include "pppd.h"
-#include "fsm.h"
-#include "lcp.h"
-#include "ipcp.h"
-#include "upap.h"
-#include "chap.h"
-#ifdef CBCP_SUPPORT
-#include "cbcp.h"
-#endif
-#include "pathnames.h"
-
-static const char rcsid[] = RCSID;
-
-/* The name by which the peer authenticated itself to us. */
-char peer_authname[MAXNAMELEN];
-
-/* Records which authentication operations haven't completed yet. */
-static int auth_pending[NUM_PPP];
-
-/* List of addresses which the peer may use. */
-static struct permitted_ip *addresses[NUM_PPP];
-
-/* Wordlist giving addresses which the peer may use
- without authenticating itself. */
-static struct wordlist *noauth_addrs;
-
-/* Extra options to apply, from the secrets file entry for the peer. */
-static struct wordlist *extra_options;
-
-/* Number of network protocols which we have opened. */
-static int num_np_open;
-
-/* Number of network protocols which have come up. */
-static int num_np_up;
-
-/* Set if we got the contents of passwd[] from the pap-secrets file. */
-static int passwd_from_file;
-
-/* Set if we require authentication only because we have a default route. */
-static bool default_auth;
-
-/* Hook for a link status */
-void (*auth_linkup_hook)__P((void)) = NULL;
-void (*auth_linkdown_hook)__P((void)) = NULL;
-
-/* Hook to enable a plugin to control the idle time limit */
-int (*idle_time_hook) __P((struct ppp_idle *)) = NULL;
-
-/* Hook for a plugin to say whether we can possibly authenticate any peer */
-int (*pap_check_hook) __P((void)) = NULL;
-
-/* Hook for a plugin to check the PAP user and password */
-int (*pap_auth_hook) __P((char *user, char *passwd/*, char **msgp,
- struct wordlist **paddrs,
- struct wordlist **popts*/)) = NULL;
-
-/* Hook for a plugin to know about the PAP user logout */
-void (*pap_logout_hook) __P((void)) = NULL;
-
-/* Hook for a plugin to get the PAP password for authenticating us */
-int (*pap_passwd_hook) __P((char *user, char *passwd)) = NULL;
-
-/*
- * This is used to ensure that we don't start an auth-up/down
- * script while one is already running.
- */
-enum script_state {
- s_down,
- s_up
-};
-
-static enum script_state auth_state = s_down;
-static enum script_state auth_script_state = s_down;
-
-/*
- * Option variables.
- */
-bool uselogin = 0; /* Use /etc/passwd for checking PAP */
-bool cryptpap = 0; /* Passwords in pap-secrets are encrypted */
-bool refuse_pap = 0; /* Don't wanna auth. ourselves with PAP */
-bool refuse_chap = 0; /* Don't wanna auth. ourselves with CHAP */
-bool usehostname = 0; /* Use hostname for our_name */
-bool auth_required = 0; /* Always require authentication from peer */
-bool allow_any_ip = 0; /* Allow peer to use any IP address */
-bool explicit_remote = 0; /* User specified explicit remote name */
-char remote_name[MAXNAMELEN]; /* Peer's name for authentication */
-
-/* Bits in auth_pending[] */
-#define PAP_WITHPEER 1
-#define PAP_PEER 2
-#define CHAP_WITHPEER 4
-#define CHAP_PEER 8
-
-extern char *crypt __P((const char *, const char *));
-
-/* Prototypes for procedures local to this file. */
-
-static void network_phase __P((int));
-static void check_idle __P((void *));
-static void connect_time_expired __P((void *));
-static int null_login __P((int));
-static int get_pap_passwd __P((char *));
-static int have_pap_secret __P((int *));
-static int have_chap_secret __P((char *, char *, int, int *));
-#if 0
-static int ip_addr_check __P((u_int32_t, struct permitted_ip *));
-#endif
-static void free_wordlist __P((struct wordlist *));
-static void auth_script __P((enum script_state s));
-static void set_allowed_addrs __P((int, struct wordlist *, struct wordlist *));
-
-
-/*
- * Authentication-related options.
- */
-option_t auth_options[] = {
- { "require-pap", o_bool, &lcp_wantoptions[0].neg_upap,
- "Require PAP authentication from peer", 1, &auth_required },
- { "+pap", o_bool, &lcp_wantoptions[0].neg_upap,
- "Require PAP authentication from peer", 1, &auth_required },
- { "refuse-pap", o_bool, &refuse_pap,
- "Don't agree to auth to peer with PAP", 1 },
- { "-pap", o_bool, &refuse_pap,
- "Don't allow PAP authentication with peer", 1 },
- { "require-chap", o_bool, &lcp_wantoptions[0].neg_chap,
- "Require CHAP authentication from peer", 1, &auth_required },
- { "+chap", o_bool, &lcp_wantoptions[0].neg_chap,
- "Require CHAP authentication from peer", 1, &auth_required },
- { "refuse-chap", o_bool, &refuse_chap,
- "Don't agree to auth to peer with CHAP", 1 },
- { "-chap", o_bool, &refuse_chap,
- "Don't allow CHAP authentication with peer", 1 },
- { "name", o_string, our_name,
- "Set local name for authentication",
- OPT_PRIV|OPT_STATIC, NULL, MAXNAMELEN },
- { "user", o_string, user,
- "Set name for auth with peer", OPT_STATIC, NULL, MAXNAMELEN },
- { "usehostname", o_bool, &usehostname,
- "Must use hostname for authentication", 1 },
- { "remotename", o_string, remote_name,
- "Set remote name for authentication", OPT_STATIC,
- &explicit_remote, MAXNAMELEN },
- { "auth", o_bool, &auth_required,
- "Require authentication from peer", 1 },
- { "noauth", o_bool, &auth_required,
- "Don't require peer to authenticate", OPT_PRIV, &allow_any_ip },
- { "login", o_bool, &uselogin,
- "Use system password database for PAP", 1 },
- { "papcrypt", o_bool, &cryptpap,
- "PAP passwords are encrypted", 1 },
-/* Removed for RTEMS PORT
- { "+ua", o_special, setupapfile,
- "Get PAP user and password from file" },
-*/
- { "password", o_string, passwd,
- "Password for authenticating us to the peer", OPT_STATIC,
- NULL, MAXSECRETLEN },
-/* Removed for RTEMS_PORT
- { "privgroup", o_special, privgroup,
- "Allow group members to use privileged options", OPT_PRIV },
- { "allow-ip", o_special, set_noauth_addr,
- "Set IP address(es) which can be used without authentication",
- OPT_PRIV },
-*/
- { NULL }
-};
-
-/*
- * An Open on LCP has requested a change from Dead to Establish phase.
- * Do what's necessary to bring the physical layer up.
- */
-void
-link_required(unit)
- int unit;
-{
-}
-
-/*
- * LCP has terminated the link; go to the Dead phase and take the
- * physical layer down.
- */
-void
-link_terminated(unit)
- int unit;
-{
- if (pppd_phase == PHASE_DEAD)
- return;
- if (pap_logout_hook) {
- pap_logout_hook();
- }
- new_phase(PHASE_DEAD);
- notice("Connection terminated.");
-}
-
-/*
- * LCP has gone down; it will either die or try to re-establish.
- */
-void
-link_down(unit)
- int unit;
-{
- int i;
- struct protent *protp;
-
- auth_state = s_down;
- if (auth_script_state == s_up) {
- update_link_stats(unit);
- auth_script(s_down);
- }
- for (i = 0; (protp = protocols[i]) != NULL; ++i) {
- if (!protp->enabled_flag)
- continue;
- if (protp->protocol != PPP_LCP && protp->lowerdown != NULL)
- (*protp->lowerdown)(unit);
- if (protp->protocol < 0xC000 && protp->close != NULL)
- (*protp->close)(unit, "LCP down");
- }
- num_np_open = 0;
- num_np_up = 0;
- if (pppd_phase != PHASE_DEAD)
- new_phase(PHASE_TERMINATE);
-}
-
-/*
- * The link is established.
- * Proceed to the Dead, Authenticate or Network phase as appropriate.
- */
-void
-link_established(unit)
- int unit;
-{
- int auth;
- lcp_options *wo = &lcp_wantoptions[unit];
- lcp_options *go = &lcp_gotoptions[unit];
- lcp_options *ho = &lcp_hisoptions[unit];
- int i;
- struct protent *protp;
-
- /*
- * Tell higher-level protocols that LCP is up.
- */
- for (i = 0; (protp = protocols[i]) != NULL; ++i)
- if (protp->protocol != PPP_LCP && protp->enabled_flag
- && protp->lowerup != NULL)
- (*protp->lowerup)(unit);
-
- if (auth_required && !(go->neg_chap || go->neg_upap)) {
- /*
- * We wanted the peer to authenticate itself, and it refused:
- * if we have some address(es) it can use without auth, fine,
- * otherwise treat it as though it authenticated with PAP using
- * a username * of "" and a password of "". If that's not OK,
- * boot it out.
- */
- if (noauth_addrs != NULL) {
- set_allowed_addrs(unit, noauth_addrs, NULL);
- } else if (!wo->neg_upap || !null_login(unit)) {
- warn("peer refused to authenticate: terminating link");
- lcp_close(unit, "peer refused to authenticate");
- pppd_status = EXIT_PEER_AUTH_FAILED;
- return;
- }
- }
-
- new_phase(PHASE_AUTHENTICATE);
- auth = 0;
- if (go->neg_chap) {
- ChapAuthPeer(unit, our_name, go->chap_mdtype);
- auth |= CHAP_PEER;
- } else if (go->neg_upap) {
- upap_authpeer(unit);
- auth |= PAP_PEER;
- }
- if (ho->neg_chap) {
- ChapAuthWithPeer(unit, user, ho->chap_mdtype);
- auth |= CHAP_WITHPEER;
- } else if (ho->neg_upap) {
- if (passwd[0] == 0) {
- passwd_from_file = 1;
- if (!get_pap_passwd(passwd))
- error("No secret found for PAP login");
- }
- upap_authwithpeer(unit, user, passwd);
- auth |= PAP_WITHPEER;
- }
- auth_pending[unit] = auth;
-
- if (!auth)
- network_phase(unit);
-}
-
-/*
- * Proceed to the network phase.
- */
-static void
-network_phase(unit)
- int unit;
-{
-#ifdef CBCP_SUPPORT
- lcp_options *go = &lcp_gotoptions[unit];
-#endif
-
- /* always run the auth-up script */
- auth_state = s_up;
- if (auth_script_state == s_down) {
- auth_script(s_up);
- }
-
-#ifdef CBCP_SUPPORT
- /*
- * If we negotiated callback, do it now.
- */
- if (go->neg_cbcp) {
- new_phase(PHASE_CALLBACK);
- (*cbcp_protent.open)(unit);
- return;
- }
-#endif
-
- /*
- * Process extra options from the secrets file
- */
- if (extra_options) {
- options_from_list(extra_options, 1);
- free_wordlist(extra_options);
- extra_options = 0;
- }
- start_networks();
-}
-
-void
-start_networks()
-{
- int i;
- struct protent *protp;
-
- new_phase(PHASE_NETWORK);
- for (i = 0; (protp = protocols[i]) != NULL; ++i)
- if (protp->protocol < 0xC000 && protp->enabled_flag
- && protp->open != NULL) {
- (*protp->open)(0);
- if (protp->protocol != PPP_CCP)
- ++num_np_open;
- }
-
- if (num_np_open == 0)
- /* nothing to do */
- lcp_close(0, "No network protocols running");
-}
-
-/*
- * The peer has failed to authenticate himself using `protocol'.
- */
-void
-auth_peer_fail(unit, protocol)
- int unit, protocol;
-{
- /*
- * Authentication failure: take the link down
- */
- lcp_close(unit, "Authentication failed");
- pppd_status = EXIT_PEER_AUTH_FAILED;
-}
-
-/*
- * The peer has been successfully authenticated using `protocol'.
- */
-void
-auth_peer_success(unit, protocol, name, namelen)
- int unit, protocol;
- char *name;
- int namelen;
-{
- int bit;
-
- switch (protocol) {
- case PPP_CHAP:
- bit = CHAP_PEER;
- break;
- case PPP_PAP:
- bit = PAP_PEER;
- break;
- default:
- warn("auth_peer_success: unknown protocol %x", protocol);
- return;
- }
-
- /*
- * Save the authenticated name of the peer for later.
- */
- if (namelen > sizeof(peer_authname) - 1)
- namelen = sizeof(peer_authname) - 1;
- BCOPY(name, peer_authname, namelen);
- peer_authname[namelen] = 0;
-
- /*
- * If there is no more authentication still to be done,
- * proceed to the network (or callback) phase.
- */
- if ((auth_pending[unit] &= ~bit) == 0)
- network_phase(unit);
-}
-
-/*
- * We have failed to authenticate ourselves to the peer using `protocol'.
- */
-void
-auth_withpeer_fail(unit, protocol)
- int unit, protocol;
-{
- if (passwd_from_file)
- BZERO(passwd, MAXSECRETLEN);
- /*
- * We've failed to authenticate ourselves to our peer.
- * Some servers keep sending CHAP challenges, but there
- * is no point in persisting without any way to get updated
- * authentication secrets.
- */
- lcp_close(unit, "Failed to authenticate ourselves to peer");
- pppd_status = EXIT_AUTH_TOPEER_FAILED;
-}
-
-/*
- * We have successfully authenticated ourselves with the peer using `protocol'.
- */
-void
-auth_withpeer_success(unit, protocol)
- int unit, protocol;
-{
- int bit;
-
- switch (protocol) {
- case PPP_CHAP:
- bit = CHAP_WITHPEER;
- break;
- case PPP_PAP:
- if (passwd_from_file)
- BZERO(passwd, MAXSECRETLEN);
- bit = PAP_WITHPEER;
- break;
- default:
- warn("auth_withpeer_success: unknown protocol %x", protocol);
- bit = 0;
- }
-
- /*
- * If there is no more authentication still being done,
- * proceed to the network (or callback) phase.
- */
- if ((auth_pending[unit] &= ~bit) == 0)
- network_phase(unit);
-}
-
-
-/*
- * np_up - a network protocol has come up.
- */
-void
-np_up(unit, proto)
- int unit, proto;
-{
- int tlim;
-
- if (num_np_up == 0) {
- /*
- * At this point we consider that the link has come up successfully.
- */
- pppd_status = EXIT_OK;
- unsuccess = 0;
- new_phase(PHASE_RUNNING);
-
- if (idle_time_hook != 0)
- tlim = (*idle_time_hook)(NULL);
- else
- tlim = idle_time_limit;
- if (tlim > 0)
- TIMEOUT(check_idle, NULL, tlim);
-
- /*
- * Set a timeout to close the connection once the maximum
- * connect time has expired.
- */
- if (maxconnect > 0)
- TIMEOUT(connect_time_expired, 0, maxconnect);
- }
- ++num_np_up;
-}
-
-/*
- * np_down - a network protocol has gone down.
- */
-void
-np_down(unit, proto)
- int unit, proto;
-{
- if (--num_np_up == 0) {
- UNTIMEOUT(check_idle, NULL);
- new_phase(PHASE_NETWORK);
- }
-}
-
-/*
- * np_finished - a network protocol has finished using the link.
- */
-void
-np_finished(unit, proto)
- int unit, proto;
-{
- if (--num_np_open <= 0) {
- /* no further use for the link: shut up shop. */
- lcp_close(0, "No network protocols running");
- }
-}
-
-/*
- * check_idle - check whether the link has been idle for long
- * enough that we can shut it down.
- */
-static void
-check_idle(arg)
- void *arg;
-{
- struct ppp_idle idle;
- time_t itime;
- int tlim;
-
- if (!get_idle_time(0, &idle))
- return;
- if (idle_time_hook != 0) {
- tlim = idle_time_hook(&idle);
- } else {
¨†ð¹‹9<üô|÷I‰)°1$8JWÞcÜk„…QX,ˆqVsê¤~ã6ü•Þ§Ä+¨6È,ŒßêŠ}Ùâ{ÌrùsŸ\×Ômê0N€ßz*ƒì2J¶€_ÏöþŸ\韊ü†1Fòe&jè ™´Ba!@ÅEà®Ó­ Ù›ÃsrËJQi+Zf¶°©ªml“[+ê¾P’.1Á¡€cÐLB¤EC–ÅAdŽL‰Qe8_¡×vïH,óx’iä‹@P̬$ôð4!ÄP DPÌ$*( TVQKP*I’«xœ/e Î)3³4صã€äpSE²ˆpv¢ZüõÆ)1ûŽ’ÍI~ ÷Â21(PEˆÃ4\Säø•è‘x¢~oꂪò^ˆ$Ðë~Ã[d¸CÑh‹pF) h(s“äùl: ¡ ’•, BRQm±ðE H;üÚiùÈÇö~˜C,I kÊë€ýÞ¹gÌQÞ¯EÒ  y€)ˆ ÷R€D+{E]Š ¡dCW~0´Q§‰0©oVf”YÉ Å§Ÿ/×:|R†!! &è¨8(ÄMì(Ò Ô"’ÇH„…é„UçÄžR¼¡døþ8”þïUà ÷ÂØÌŠ"Æ:FE¨‚;ÀBêÏǨps Žt¤¸ ¤ïx¿9}B팟¢PHõ*´ ¦Fu=~ÈYÆ>S|æÝ•çj7žm«|)”–ÉEkw,vÐœ ÃåPCõ2‰Œ(:ùô Œü%=Ä Ü@¡©ì{:Íܶ·01E5 ŠEIÚ„qT¨š‘ÒÆ4ÀÈ îAÉ `Å ˆ$€…E{jqEOà#4×3w\„¬"øn;ÄÝÝÚQn̒Љ¤bØÊV {AÛ1ÄtåÈà"^–@À„à hÈs­›órĉ'áñ?Øús¬8÷Vöâ)Ô}ÎU"‚‘늧½i™$.Ù`QÛ’XÚ­nîÒ@ûê½=Ó‡ÇÕÛc=~ÏaY %Qæ!Ýåõž¬’ÉüJZ…b"&’â¼7º’ª¯ ¹4K*T N€‘‘A±T/ÑÌ 0„^ž­âÒž´¢‘‘$³YÅT[[KE°;¹.ÌÓ5¥>³s!Epj*§|T$€€rwþ§£Ñ•W¦8‘SsöC€Wªí䨇’d@M#‚ºŸÔÈãOióz¶€!ñ>O[,-~¹J>!Kˇu€ž"FÛ™6Pa À€zØ—Ý`id-l1ŠRwƒ‰…‚Q@¨¨H¢+!ÕLd¢ŽeAF  #Ƥ-ƨ´HX¢¥²ÐjJ’ŒÄ"a•bу Ƥ(𲈌!¨p„åy¬Z(VBôal' p1pÁ( -'¡¡släKQ·²ÛjtIý°±LÔ>È’!öÁ¨Šµõ{}žmàmFúJ £m´j-­\[[\ËÑmXµlmŠÖ™µµ¹8Ú±IÔU·ÍZ³&Õ(›^ mÅ 2,b" ˆ-DT¨8i•¯‹íý¯…®ú÷¨†‰šÞdKQà8µÎ ø¬¢„ôÕD’hLª²@b ŠVÁ@YBØW‡Qa &ŒÇJh-K }Ìþi½+¢Ç5D„#ƒ¨ê'—÷Ò™ÎXÔéâQßÁE4 ð†Ât왡šfÈð§.s~Ÿ›zVŒhÖª²¡–µfIU¬Ú¨,U´©)U¥1Æ•¨Õ"2+ ¨’Ad5£LÀTTd„ ÌPn§,rœU´4Œ c2:˜üçYî2í<>fÃ#J æ¥b´Íæ³LìâùžØ%ÙNÄ!ã…ôu´œã!ÁUS! WŒKM ³h%¤ÓÎ ØÉ úµ¢ÌàOiù›tÝM¯èuZ–DöC/£ôý»iPnð»pϬ,óŠó‰¬CNèSL f³-°"Rà*šÅà:ž˜Ð~r„T\:ÁNEõLÓ“GÄKÈPÌ5u¨S"G‚u¤É(ª‚B(+$%þï¬ß@Œ1•ËgxÕ«,cLˆ‹iV¬XÎAÍE)0Zy —aIóŽõs•-[—«h‘û9Š‡rÌl3"À‚ƒwÏ‹¶Fr?¬r8ðñ¯lì!¶OÚŠqTq5øh`2k BJ²ÑÈ}Zdj&ÎÒÐã‚î`à-aâj^3†Ý8niY'—<úvÁÚ_Y{5\÷<ÑËté=»Ô„|UÃê¨Düeë¥{¡§ã§åãòSÊò^r¨qFq<ú¿¤æL„z.d™®$í*¢PJŒ¿}6ÐsŒAõx¿Î—ZùŒgŸ›Ã|bˆ~wŠNxH•)`–2©§ÕëS±la‹>oAñ:@€È{”(€$×ENÍßZ.LÄÒ-Jà{òøረ®¬­T‚û˜«¨ó?póHæ°Ð˜‰ƒ–Ô\ëý]™³V*Æ>ŒÅ•†1ŠlŸÀˆòÒ…Cœæ‚ ‚ƒ‘„νôP’„@J`‹ºüí X!Ã(™fb ÆkÒ$ŠÊË•,*P¢TZ#¨DwÓÁ4j6HDÄh”£T8¥Ä0‘'ê¤1$aÈÂP1ƒ» ÂúÔ°€1=Cz6 áÂYpµ…,$Î8ADõQ::àféo6ƒ$Ù·vœ^¡>»ÙAdðsUQçx3°ÔÄÌ$žm©y`H$à$ ÂË7ú>­z‰C÷àÁ"IÀ‚î|¦eú{Ê3Ìæ(7depÄu´"˜,q9qh€v%ûôë”%³±’ËdQ 9ñ´¹¤:/yE}ô¤•IÕ¢èA|55¦Œ„ ifP‘dQ@ÇÈjža[:ì›gƒÎ…r$2 ð²´¨bÁ)d †…J¤1щ87†C‰K±c؆Œxú›E Åò—‰’„ —Ie/x`‚È‹é*eAL‘ 7Ï’(k^P´yU©¬ßyÈ Ûæ(BYHÊ@X@´¡ÐJF” ¤Ë¥M›¿ «ùMÙÀÔšc•ä¥¬ãÍÝ©eè©=–²Þ‰*žK),‹ c¸ÒYÅ=9VÓéb;¾TÑSØ”H¢vÅ!ß(RC£Â´D`"§¢å¥ŽñÃÕ¨kàQžxï4ÆJY̶ÞÒEI è Ø°´²…µ\ Ø°´±j*¸1±aibÔT!p(cbÂÒŨ¨BàPÆÅ…¥‹QP…À¡‹ K¢¡ C–-EB†6,-,ZŠ„. lXZXµ\ Ø°´±j*¸1±aibÔT!p(cbÂÒŨ¨BàPÆÅ…¥ž:NÌO DÀ)ÝJŒW¨AŠ­¡MÚØRúœ7:“ pýÞEYF¨ç¥,Th±cE‹,XÑbÆ‹4X±¢Å,h±cE‹,YA‘0jcß|!·ˆ\ؤ¸TK€ÕD í²Ð6¬¯œWUï4ÐçzCÝæ<ÒúÊ/±Ì¶“x…¦b‡^6õÂA|Ô?LJli»e^b v@HˆDFF•…@b÷D+¾R@ŠF `)*‘jBÁÍ’–T$¿ïp{’ḫÝ@¥-*Q–0:´þþ®#:„3Ð).+I6ºÆ*Ä žÚ0„ÇÅ€*(D‘#–@©$–B JTõ†`D# $™XØ%饆™ûªsæJ =v?ŽIq¡¤ô#„,q¡Ø0߯z¨fB,± ÃyðÇ ÓÍ©›gLÑR•É0Ĩº ®¬6Œð^*'¸GK†éZãÖiEÚÖÑ+¬’O-8]qy©ºæ!#Ê}ñÎpám±:eot¯Ž§Œ‚$„Ќԡ¯§ Â"p-•29™¬áaÅ8 ´ïBK I3:Mˆ !F±¨‰„”Y Ê[ T—Ξ9 ;wQ„é*¼™¾LF~¼é!Dg·Ûà2GXHÂ(È –U´ÇøAˆbÊh p†ŒV@™ >Þq‚/PŒ³-LFˆò8%Õbˆ3jŽÔÁS‰ö ˆÕÄE&Aæ@€(X]”ÄD P $La1îp쌠ÄÄ ùSï'g…>½= 0,„+[jt˜;T›dÙ‘„%Ü«­À,-@b!¡$²-dÆ´¶Ž‘$H†Å[` [jR¹Îfš-ešÒ´ck²«M©KS-Z5VZH‘0™?t HLæJ#Еˆ D…4Ð E3†. @83ˆHJä²6¶XO•áÆ „¢€”)@ú¿&¦¨.â‰I‚žR¡×â’“‰¹Ù¡(ZFP!'o}•.›Â‚ ‘’YK¼FÖ‘’[I¼¡„èó_HrH U3„m¤¡°§/ _±uòxr›ß™|ìT¢@øòõ|d6î:†5N%†a¼=ÈFiæI$`9õy­cmÕT´h­ZŠÖkXÕ©Mªè\W%oekhÈH¤UJJ()Þn€/86Øj‡Î@àg[.T‡Ï U_©,£"©£*Õ} ‚æ0i˜ú¢z±± ÄíO¶F½ö¯žÈÀ|B>þ6½P?Ž)£¡å m¿C@ž(´,DsQ,nÀJ¡i@-D°»9Aùc°„»íÃƼ‹= 7rø%¥Gk‡Z Jk3‡#"s•!!çt&„C¾:N"Ž­~äéŠsÕô|(éçÉÒt¤">×Ýa3%I(© ¬V0%hNùs›‚Yõ¨‚ôôŠ(Ic€©©n„C…9 ð·B ! ¶ê”Ês6§/©Ï¥ÞfÞ ´‚Ƀ¨…Æ…„%¶ÕÖ[2ܕݺtÄT)SHP@‚Ö # ò„Â@Ò…J\*”$ aA–1Œ8íu­á¶6Í]ôÖÜX•“`¡2d!C‘1‰ƒÀ.è‚A“†$&Bjq!Y& P7H$ïJlK’À㊜F c åÑÜ 7PBÀ wѦ*C¤,o|ø‡ñ¯Úø'ß“†k¦£éƒdÃDˆ5*ÈùPX:èC$ Ÿ°4‡!•kh½9E^,áO-Íö¡˜ýwQt‡+¡¸€áÅšV¾ÌM®XtAŦâÇúb)Ïï‹`6A|«KV{äÉGV Š B.Å °@y*æ§RÎÿ4;l ¿ €éI©”JbT%$’U0TB„H{à-Øè9‹ƒ¥ú<ŸÂþñ[©Ô(!ö0üRE‰Å–ˆ©Š¡ë‚ö;Wî÷°„*ø$2"t>LZ‚Qˆqb¶¯`{>\hàBå’@¬B7UÐ$õ¤D)B!áýŒgŸðÑ 3¸#NÜ×ÛêyЧîÄ º#ÅÝ {¶ ª3 ‚ì] ˆ@¨BCØ!òbˆýÑB4ª;_aÓÀ˜äÚ â'`I"§-è X Aƒ‚’k+Z MZjÔ©,Š§.\Êõ¸ÕZK쵶«“[m›_;8°$„R+ËzE¸€lô .'$ˆ¯%ÓÏ]m]"û@64‚ Í"€è‹ëó¶©õÀJ¹$­ u Q: ŒŠ#Š>äWŠÈˆðƒ<¾6ÔFÀßø³Dtì ?vA<áÑ5]àª[B(iå:$y´QÊùrÅD_ÐÄ{w"†8 *¿9³ÈT iH"$E +fÃÃF^i'_„»I+eÜ H+Ö©4Ë‘âd¬-A‘äé¿#¨Ã{rˆ]Œ2‰é‹g¤;I €I‰$+$û¤…:jŽ J(0ú×È5$`ÎRJÉÑJÊP¡¥cz£ïdW@oÐÙë*‡IñãÆìs5 È#qBŽ­’ã*p¡Þ\á°›rÁè0pƒî2üZVF¬G¨A%:ƒB!̤ò€qÁ¤aRÏ»£ ä8˜´$Ó%ª­”xª#Ól¡öñ}„烨T7ùá! ’"D⼆ 'NHg¸÷ ƒŸ<2z󠪢»sÐÔ@áÌÚÕ¢Œ—ž/âbÔÉö‘g'Æ1XŒŒH…l\|çuô›òôPÑ$„e‚О±ª+&˜lœ99Ç‘$ SÅ­@WœXôÖÃÑâUx‰àAMF|£åb…0“.m°¦QÍ  ªx—¹æ¨« ž˜C§ úÞ”(÷v!²$ó|]u÷5A"¬4Ê”µxëéõï‡F>íêD ªIÉâz‡ië¢ £Î/'hõÅs¨@ùñœ!éåÙ´„ D(÷V1aÔs;Dg½8Xd (ü–g”Ûáâ¯ÒJI—&@¢¤°Ùn›¡ïÝýe}«%ª\.7A–!ñRg@À0“ ˜"ÑÑO‚ŽÍ—_?>ž4Yí×Í!âáD³´û¥–)Õõ»äMOvBù`Äòäoä•"$ÙA$CŒØãÙæ8;]…c龍 Ìã·Þ, °Ü1iDKIKq†ÒïŽ ó2…¾|5Ö'e…fTç6ãXŠky©[‘›,Z–ZÌ›Ic,°ªYµ™e€¦©fÖe–5K6³,°ªYk f€ÍSM¬Ë,j–ZÂY`‰ªYk)mfY`3T³k2Ëš¥›Y–X Õ,Ú̲Àf©e¬Õ”›¥ßP¨8É v¬Ê1™.V 1iU"]ƒØž”îŸ?õu-ÖÕà6N~è_$(Hz T¨*×}!m¢J„• }Nt¢‡Iñ{… ^RQ¹ý2¾Œ"†vû$«éG‡s€SQß>"ä($¢½ÊPOd°²Oa„@©P* R}CG0‚c jqóê_PSö–"q XßÊ…‰#ûÜ8X1±da¢€^ÌÊ#A„qÌB"3# N³ˆ¢ôîÞI´M2°J dˆB!‚ ¶0 @À…12¬‹_¨Õ t ¨‹à¶”9Œ—! O(sKSÇ£f`P#E±‘ÌUi7 .F1‰ Ë )èyÈÒñÎŽètþôç×Þvý¸’åÝ؈¤A0‰"äª1jNÇP?€1*®¿Á÷‰Ý`dŒ'çñíß-÷™"ZbãL ýâ![/Ç‚$¢FG¸)”~zCª:¢DCaÒ=˜xÇ2FêJ@4TÞ‘â-(£Q* B*DA!;ÁX¡`˜ pw DÓ¡º dHÁ 0¢Q]‰@lÕ+ÏSz‡•”èb|öRñχ@|£4ƒKÝB@ßÛìí‡I;Ó°8\…>š©D¹Ö•áºÝWÊ·‰d˜”b)!µl­‹$‰ Yk«U6ڷؾͯÕ»¶…ðÔ€Ä  “Y¡)!ö¢X˜ åñýcƒ $±@™€<#¸[aW#¼gÞûTA™»3–”0[±Š‹*†3h„ÊÒzDH>¤Ò¹Êþy¡ÖtŽ2ò(½”Uk‰rÔO%ÙEPB¨0`"Ú;¨eƒ„y¢!ivV†ØP ¯m€Ù*SF5;íÆÛg*dÌT¤(•Y„(‹ Ba’M¤³¡ ¤xP K’01B¢ZÖq5e ÈÀ¬!X"¬FB«(¡¥”’Í­±Í[RÒÁ@9¬ÀÃYP¿œ3ÂpamŠÇ-TBD[–%HX’™²ÍËœ†»·5Æ®,E,ˆÈ’YµŒJ!@V8pÅÁÊU/<Ù ÌÏ>ù9D¨%Aj•ÙzŒ #p$‘O®€dà`5•€T´¢~EXàÌ 3„ ­-@qB ‡ÏUd‚÷„D6ƒ›Ë‘Óz`¢@6 —ÖÁL m΀ T(È *@DŒ ’0d€ÞrÔ8!ÊX%âS(p…¸³ ÖPG‰&NDh 4šDÄÚÔ6œ9ÏšÎ2 ,ÅBôŒ3±ð¼"Û¸`ºÈ‘G*«¤ `6çäÂvû­-t|vÃäQ_KEa„ì´¨„+MÌýˆ HÁXWáz¢NaÎKùÈ•áÙ!![«†£Ã£3; *ÔëNž@ê&Ý1õ0=a@ÓQ‘HJ²‡«@:Ô`jxШòÒƒ[…ÖqQ,@V„^Ç#1ñ`ÁH¬ ûcÔÉÍ¥DÝØ{!#À'8P[ÂUM™$œÆŽ¸'šÏb‹œ!ÊþØ‹:¦°lÒ>›56xÚú €,’0Ï2)šæÀ°Bz!ÏÇØgÉÉGcÉŒ"‚1 ‰@/‰J'm†mØ}¨¿la½-.-V³®£3#R¥7‡¾èÈ„ì˜ ãhpó)ß|\5PÐÝSü"8ÀÜ@33AZ «„èò™ôC÷WíZ›°`#Ùl6"óÊîHŽ ¤ lxu‰ã­é÷ŸRd–çãC'©J HETdRBO¨Áä² Df@U(Ã'`Î0wÏ Òß }=a@P“fX–¥²Ú6²Õùíxåt­6„”šÌ«H­ŒlÅÊ*5kµÕxj|°U¶»oÅoÈyÀÏùŠ*¿ÔQUù_vçH¨C©SÙiÈ7o €v Úõ± x…jã$¿‡gðÜ“Ÿ×W°(=’…(n@i.Ä„IõÆ`C'ÆbŬq°ë…!Dœ²œÏ18Çh’0Ü›LòQHS# =¦ …ÈBDV!ŠTD'L¨Á#ͦDCP¤‹É$P“T@]Dk Ïkw?óñÿš‚¿Ÿçÿãì¯ùÿ—þ÷ö“33;ßð²é­LÌÌë^¿ïξjffgZöÿ©:ýmjgÙ3;ßÇþ|ëßÖ¦á™ïû¿ü'_ºÖ¦Jfw¿»õN¿SZ™ÿêfw¾u:ý®µ3ÿœÌïüþLÿ øZÔóøé™ç?£ý”ëþ½jgò¦g{ÿsøs¯õõ©ŸáÌÎ÷ÿwœëøZÔÏû³3½ü=çQ™3þ ÌûZ|_ÕïydÿÂìÑú«ËÿÛÃ;ýÿö}äþ™Ïþî¿ýú*ž_/'ü,ÿ©¿{þUçü4Κsâÿ$çûŸí}“Ÿ³ÿûT~ïÿº(ÿoþ”üwÎÕ9ÿ«Ë?ö¿óìÿ©;?ïÙ?û?äŸù~©þ?ìÎÆý2Õ䌿,ÿ¯þoîNÿ'_õ{ÓŸrsÿ£þyÏ‚súÿÑ9þôçîÿíœøÿÞŸþ¯ôOWùÿ«ÉêísQwÛþç÷¿ú¢sËýŒ¿ÏûŸ²sÿsý™Ïýôçþ¯ög?õ§?¯þ)þ/Ÿþ×ÿ¼œÿØ„Ÿõ;OËdÿÁû¬T‡ùè%:*:ûèñõ3wóNAÝW;ä/.ÿküSóqD8îã—L¿›ˆDDª”«Cý¢x bAè I¿z{9G„Þì)BÄÕþêCýGîÒŒ[Y®W+j¹LŠbÃüú]tÿ!É4ýØŸ¬mxáÔÝ ô}Ú¼ÕÖÞ‡9$6Èi6»õÎÚE F,1uÇzÚAM@cñÿܤÌò83Où)ù=‡äçe8hñ+v ˆ©´PÖÚa’ÿñÞŸæfÜífoúù6ÆËêK.¹N1T»ksþ´Y_¬@•ñص ‰CóyÈ„¹ß½C½ÚªH;èa¼ó_ˆÞ{¶nÃôšQ´3ÌB\tVÙáÜÔ@’ l`˜ÅÕìî;›dPvó”ßÚ°vL¿ÇSºÎæˆØV“ÀWŒ ÊŠ€‰BK­¿ÝÅMµ½ºemË..ÆeP¯ª¢ŠmK„a46x‹Gžƒ²'Lâ¥!Ç!ätêkŸñ™5»²øuëÛa¹RÆqëõ€·/?¯‡<¼ÿ^œv¿~fWµãå&FáÂç†-C¨éƤ~ÛDTR,J¹!¸˜+/ÆÚbØÌOŒó(5=°÷/óG4væƒÕ€axFy1³µ”è`PÜ %¦»q6LÉ‚\F?±{ä³­§fÕ qgm— üjY†î¼Ü+çË ”/|ë(à XX³¡­›¨`;±e0ÕåÞ‹f†Å™m)o._vä_½×[¨³"ßYÎópµG;N)ÙIK±L@§:G“¹­ƒÜ<.Ý–ŽòÏ ­Š˜kÙÚÚ…lšÝÀBB™+G@`Õ]K”ÓÈoÖff¥²|.§c"­Û&–߇„‰¤£§âq”î ­'ö^»QÒΜӞg ÎyNx¤ï“9Z ¸l4lÞ]©YÔØ14!´K‰oWaƒÍ—µ¹ Üfƒ´ûËB㻈¿Z0§^çì šø”ŽÑ²"‰x9oOr¾ KMw«dðA%¼ÄÃ%‹KF4 ž[ƒ¾Q½&ÎJ¼I8«.m“9 Šá×·ERVv"Š~ÝŸAÜs~cáãg0¯žÁ=½h¸ÝŸÆeCéîY¢lÒ"*€}-`ÕÅêÈŽïnÉBz5ᶫÈ=¢uâÚ/(*¦©Ø¥¿È÷gµ½5WåáÙ!ÙLíÛˆ5ì z7×!â þF‰GÖ3JkÂCnŽmŽQø&Ð ¸tß QÄÉ;WrHÇ{œíÿ;^yçæì¦bÉíŸè¢t9ïÈzð•çŒ*Õ&”Ý.EÁL¯3Ñ#õÂaÐ&cË¿\ÐV”Š‰ØÃàž=÷½vËc,îJ”Sº‰&a @ÂHø1Þ©$;5{ÅTuÝþÎу¯Nn)ÏljžyÛØKB ±‹ôd3tSØ`IÒÍõ4óð8l_£ÕÁ–•3ãWtT¨FÃèë¼ Q9 —ˆa ´P[- ªÀU„Ј½™^P„:2:M°vÍ:a8jäÌß®’®7ŠÏPS™È(lµ¨ÁØqâA5jY*-¯ÚHo$³»ñ0˜'lÅ =,ŠK£2’w³‘€,0 ñ s‚œ€óq±CÀƒ@kÊÕÛ+X}­«u·æ­ø>ò,QŠ ‘ó™fji÷ývî)°Pœi0£èŠ‰"ƒóª8TrQ:"æWh ãÂ'¢T*ænœÎC"† !î  ± v„°‹x=È@•ìê—YzLQ¶ÛŽŽëäuÓxr+È=wN­çEñ˵ÜÞô¼€¸G=ì‡Sœ:‹.,§íqvȨ},E;Œ+q¡À`­ (^aG`P·þ€¼]`ŠCƒm´R¹ß— SóÇêúêK3ª‘÷ïÔãk:Yâ-^yhLˆA˜Z„¼È~c±ïxf™¡ÁSÜEV’ã á‘ï=‡‹Jª†@š ]ÍǯˆˆàŒ@`øˆÉp7(†æàÙ*9Ž µ@Mñ¾· ¥jòèh5Â!ù¿he0I3©òÒâ.<ƒs«‹Þu‡þÈ{w: tí8Z}ñQ?ì§]^Š%&?eâMÜ8Ë&gág«ÌYÐat 4é0/ùì#3vž¨5ê,=:a€¡ÕÔ9r–yJÒFH²!B½$ŽäõŒDåÔÏ «Wu©Úׂ×ìkz÷•EÙiˆ „@â} RJ–”¤¥¥)©iK •-)H%KJR ­¥( RÒ”ƒ+iJA0jjRJ–”¤¥¥)©iJA*ZRJ–”¤¥¥)©iK ˜55)H%KJR RÒ”‚T´¥ •-)H&€(ú
-
- if (!am_server && passwd[0] != 0) {
- strlcpy(secbuf, passwd, sizeof(secbuf));
- } else {
- return 0;
- }
-
- len = strlen(secbuf);
- if (len > MAXSECRETLEN) {
- error("Secret for %s on %s is too long", client, server);
- len = MAXSECRETLEN;
- }
- BCOPY(secbuf, secret, len);
- BZERO(secbuf, sizeof(secbuf));
- *secret_len = len;
-
- return 1;
-}
-
-/*
- * set_allowed_addrs() - set the list of allowed addresses.
- * Also looks for `--' indicating options to apply for this peer
- * and leaves the following words in extra_options.
- */
-static void
-set_allowed_addrs(unit, addrs, opts)
- int unit;
- struct wordlist *addrs;
- struct wordlist *opts;
-{
- int n;
- struct wordlist *ap, **pap;
- struct permitted_ip *ip;
- char *ptr_word, *ptr_mask;
- struct hostent *hp;
- struct netent *np;
- u_int32_t a, mask, ah, offset;
- struct ipcp_options *wo = &ipcp_wantoptions[unit];
- u_int32_t suggested_ip = 0;
-
- if (addresses[unit] != NULL)
- free(addresses[unit]);
- addresses[unit] = NULL;
- if (extra_options != NULL)
- free_wordlist(extra_options);
- extra_options = opts;
-
- /*
- * Count the number of IP addresses given.
- */
- for (n = 0, pap = &addrs; (ap = *pap) != NULL; pap = &ap->next)
- ++n;
- if (n == 0)
- return;
- ip = (struct permitted_ip *) malloc((n + 1) * sizeof(struct permitted_ip));
- if (ip == 0)
- return;
-
- n = 0;
- for (ap = addrs; ap != NULL; ap = ap->next) {
- /* "-" means no addresses authorized, "*" means any address allowed */
- ptr_word = ap->word;
- if (strcmp(ptr_word, "-") == 0)
- break;
- if (strcmp(ptr_word, "*") == 0) {
- ip[n].permit = 1;
- ip[n].base = ip[n].mask = 0;
- ++n;
- break;
- }
-
- ip[n].permit = 1;
- if (*ptr_word == '!') {
- ip[n].permit = 0;
- ++ptr_word;
- }
-
- mask = ~ (u_int32_t) 0;
- offset = 0;
- ptr_mask = strchr (ptr_word, '/');
- if (ptr_mask != NULL) {
- int bit_count;
- char *endp;
-
- bit_count = (int) strtol (ptr_mask+1, &endp, 10);
- if (bit_count <= 0 || bit_count > 32) {
- warn("invalid address length %v in auth. address list",
- ptr_mask+1);
- continue;
- }
- bit_count = 32 - bit_count; /* # bits in host part */
- if (*endp == '+') {
- offset = pppifunit + 1;
- ++endp;
- }
- if (*endp != 0) {
- warn("invalid address length syntax: %v", ptr_mask+1);
- continue;
- }
- *ptr_mask = '\0';
- mask <<= bit_count;
- }
-
- hp = gethostbyname(ptr_word);
- if (hp != NULL && hp->h_addrtype == AF_INET) {
- a = *(u_int32_t *)hp->h_addr;
- } else {
- np = getnetbyname (ptr_word);
- if (np != NULL && np->n_addrtype == AF_INET) {
- a = htonl (*(u_int32_t *)np->n_net);
- if (ptr_mask == NULL) {
- /* calculate appropriate mask for net */
- ah = ntohl(a);
- if (IN_CLASSA(ah))
- mask = IN_CLASSA_NET;
- else if (IN_CLASSB(ah))
- mask = IN_CLASSB_NET;
- else if (IN_CLASSC(ah))
- mask = IN_CLASSC_NET;
- }
- } else {
- a = inet_addr (ptr_word);
- }
- }
-
- if (ptr_mask != NULL)
- *ptr_mask = '/';
-
- if (a == (u_int32_t)-1L) {
- warn("unknown host %s in auth. address list", ap->word);
- continue;
- }
- if (offset != 0) {
- if (offset >= ~mask) {
- warn("interface unit %d too large for subnet %v",
- pppifunit, ptr_word);
- continue;
- }
- a = htonl((ntohl(a) & mask) + offset);
- mask = ~(u_int32_t)0;
- }
- ip[n].mask = htonl(mask);
- ip[n].base = a & ip[n].mask;
- ++n;
- if (~mask == 0 && suggested_ip == 0)
- suggested_ip = a;
- }
-
- ip[n].permit = 0; /* make the last entry forbid all addresses */
- ip[n].base = 0; /* to terminate the list */
- ip[n].mask = 0;
-
- addresses[unit] = ip;
-
- /*
- * If the address given for the peer isn't authorized, or if
- * the user hasn't given one, AND there is an authorized address
- * which is a single host, then use that if we find one.
- */
- if (suggested_ip != 0
- && (wo->hisaddr == 0 || !auth_ip_addr(unit, wo->hisaddr)))
- wo->hisaddr = suggested_ip;
-}
-
-/*
- * auth_ip_addr - check whether the peer is authorized to use
- * a given IP address. Returns 1 if authorized, 0 otherwise.
- */
-int
-auth_ip_addr(unit, addr)
- int unit;
- u_int32_t addr;
-{
-#if 0
- int ok;
-#endif
-
- /* don't allow loopback or multicast address */
- if (bad_ip_adrs(addr))
- return 0;
-
- return 1;
-
-#if 0
- if (addresses[unit] != NULL) {
- ok = ip_addr_check(addr, addresses[unit]);
- if (ok >= 0)
- return ok;
- }
- if (auth_required)
- return 0; /* no addresses authorized */
- return allow_any_ip || !have_route_to(addr);
-#endif
-}
-
-#if 0
-static int
-ip_addr_check(addr, addrs)
- u_int32_t addr;
- struct permitted_ip *addrs;
-{
- for (; ; ++addrs)
- if ((addr & addrs->mask) == addrs->base)
- return addrs->permit;
-}
-#endif
-
-/*
- * bad_ip_adrs - return 1 if the IP address is one we don't want
- * to use, such as an address in the loopback net or a multicast address.
- * addr is in network byte order.
- */
-int
-bad_ip_adrs(addr)
- u_int32_t addr;
-{
- addr = ntohl(addr);
- return (addr >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET
- || IN_MULTICAST(addr) || IN_BADCLASS(addr);
-}
-
-/*
- * free_wordlist - release memory allocated for a wordlist.
- */
-static void
-free_wordlist(wp)
- struct wordlist *wp;
-{
- struct wordlist *next;
-
- while (wp != NULL) {
- next = wp->next;
- free(wp);
- wp = next;
- }
-}
-
-/*
- * auth_script - execute a script with arguments
- * interface-name peer-name real-user tty speed
- */
-static void
-auth_script(s)
- enum script_state s;
-{
- switch (s) {
- case s_up:
- auth_script_state = s_up;
- if ( auth_linkup_hook ) {
- (*auth_linkup_hook)();
- }
- break;
- case s_down:
- auth_script_state = s_down;
- if ( auth_linkdown_hook ) {
- (*auth_linkdown_hook)();
- }
- break;
- }
-}
diff --git a/c/src/libnetworking/pppd/cbcp.c b/c/src/libnetworking/pppd/cbcp.c
deleted file mode 100644
index eb60a8e249..0000000000
--- a/c/src/libnetworking/pppd/cbcp.c
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
- * cbcp - Call Back Configuration Protocol.
- *
- * Copyright (c) 1995 Pedro Roque Marques
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Pedro Roque Marques. The name of the author may not be used to
- * endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#define RCSID "$Id$"
-
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/time.h>
-
-#include "pppd.h"
-#include "cbcp.h"
-#include "fsm.h"
-#include "lcp.h"
-
-static const char rcsid[] = RCSID;
-
-/*
- * Options.
- */
-static int setcbcp __P((char **));
-
-static option_t cbcp_option_list[] = {
- { "callback", o_special, setcbcp,
- "Ask for callback" },
- { NULL }
-};
-
-/*
- * Protocol entry points.
- */
-static void cbcp_init __P((int unit));
-static void cbcp_open __P((int unit));
-static void cbcp_lowerup __P((int unit));
-static void cbcp_input __P((int unit, u_char *pkt, int len));
-static void cbcp_protrej __P((int unit));
-static int cbcp_printpkt __P((u_char *pkt, int len,
- void (*printer) __P((void *, char *, ...)),
- void *arg));
-
-struct protent cbcp_protent = {
- PPP_CBCP,
- cbcp_init,
- cbcp_input,
- cbcp_protrej,
- cbcp_lowerup,
- NULL,
- cbcp_open,
- NULL,
- cbcp_printpkt,
- NULL,
- 0,
- "CBCP",
- NULL,
- cbcp_option_list,
- NULL,
- NULL,
- NULL
-};
-
-cbcp_state cbcp[NUM_PPP];
-
-/* internal prototypes */
-
-static void cbcp_recvreq __P((cbcp_state *us, char *pckt, int len));
-static void cbcp_resp __P((cbcp_state *us));
-static void cbcp_up __P((cbcp_state *us));
-static void cbcp_recvack __P((cbcp_state *us, char *pckt, int len));
-static void cbcp_send __P((cbcp_state *us, u_char code, u_char *buf, int len));
-
-/* option processing */
-static int
-setcbcp(argv)
- char **argv;
-{
- lcp_wantoptions[0].neg_cbcp = 1;
- cbcp_protent.enabled_flag = 1;
- cbcp[0].us_number = strdup(*argv);
- if (cbcp[0].us_number == 0)
- novm("callback number");
- cbcp[0].us_type |= (1 << CB_CONF_USER);
- cbcp[0].us_type |= (1 << CB_CONF_ADMIN);
- return (1);
-}
-
-/* init state */
-static void
-cbcp_init(iface)
- int iface;
-{
- cbcp_state *us;
-
- us = &cbcp[iface];
- memset(us, 0, sizeof(cbcp_state));
- us->us_unit = iface;
- us->us_type |= (1 << CB_CONF_NO);
-}
-
-/* lower layer is up */
-static void
-cbcp_lowerup(iface)
- int iface;
-{
- cbcp_state *us = &cbcp[iface];
-
- dbglog("cbcp_lowerup");
- dbglog("want: %d", us->us_type);
-
- if (us->us_type == CB_CONF_USER)
- dbglog("phone no: %s", us->us_number);
-}
-
-static void
-cbcp_open(unit)
- int unit;
-{
- dbglog("cbcp_open");
-}
-
-/* process an incomming packet */
-static void
-cbcp_input(unit, inpacket, pktlen)
- int unit;
- u_char *inpacket;
- int pktlen;
-{
- u_char *inp;
- u_char code, id;
- u_short len;
-
- cbcp_state *us = &cbcp[unit];
-
- inp = inpacket;
-
- if (pktlen < CBCP_MINLEN) {
- error("CBCP packet is too small");
- return;
- }
-
- GETCHAR(code, inp);
- GETCHAR(id, inp);
- GETSHORT(len, inp);
-
-#if 0
- if (len > pktlen) {
- error("CBCP packet: invalid length");
- return;
- }
-#endif
-
- len -= CBCP_MINLEN;
-
- switch(code) {
- case CBCP_REQ:
- us->us_id = id;
- cbcp_recvreq(us, inp, len);
- break;
-
- case CBCP_RESP:
- dbglog("CBCP_RESP received");
- break;
-
- case CBCP_ACK:
- if (id != us->us_id)
- dbglog("id doesn't match: expected %d recv %d",
- us->us_id, id);
-
- cbcp_recvack(us, inp, len);
- break;
-
- default:
- break;
- }
-}
-
-/* protocol was rejected by foe */
-void cbcp_protrej(int iface)
-{
-}
-
-char *cbcp_codenames[] = {
- "Request", "Response", "Ack"
-};
-
-char *cbcp_optionnames[] = {
- "NoCallback",
- "UserDefined",
- "AdminDefined",
- "List"
-};
-
-/* pretty print a packet */
-static int
-cbcp_printpkt(p, plen, printer, arg)
- u_char *p;
- int plen;
- void (*printer) __P((void *, char *, ...));
- void *arg;
-{
- int code, opt, id, len, olen, delay;
- u_char *pstart;
-
- if (plen < HEADERLEN)
- return 0;
- pstart = p;
- GETCHAR(code, p);
- GETCHAR(id, p);
- GETSHORT(len, p);
- if (len < HEADERLEN || len > plen)
- return 0;
-
- if (code >= 1 && code <= sizeof(cbcp_codenames) / sizeof(char *))
- printer(arg, " %s", cbcp_codenames[code-1]);
- else
- printer(arg, " code=0x%x", code);
-
- printer(arg, " id=0x%x", id);
- len -= HEADERLEN;
-
- switch (code) {
- case CBCP_REQ:
- case CBCP_RESP:
- case CBCP_ACK:
- while(len >= 2) {
- GETCHAR(opt, p);
- GETCHAR(olen, p);
-
- if (olen < 2 || olen > len) {
- break;
- }
-
- printer(arg, " <");
- len -= olen;
-
- if (opt >= 1 && opt <= sizeof(cbcp_optionnames) / sizeof(char *))
- printer(arg, " %s", cbcp_optionnames[opt-1]);
- else
- printer(arg, " option=0x%x", opt);
-
- if (olen > 2) {
- GETCHAR(delay, p);
- printer(arg, " delay = %d", delay);
- }
-
- if (olen > 3) {
- int addrt;
- char str[256];
-
- GETCHAR(addrt, p);
- memcpy(str, p, olen - 4);
- str[olen - 4] = 0;
- printer(arg, " number = %s", str);
- }
- printer(arg, ">");
- break;
- }
-
- default:
- break;
- }
-
- for (; len > 0; --len) {
- GETCHAR(code, p);
- printer(arg, " %.2x", code);
- }
-
- return p - pstart;
-}
-
-/* received CBCP request */
-static void
-cbcp_recvreq(us, pckt, pcktlen)
- cbcp_state *us;
- char *pckt;
- int pcktlen;
-{
- u_char type, opt_len, delay, addr_type;
- char address[256];
- int len = pcktlen;
-
- address[0] = 0;
-
- while (len) {
- dbglog("length: %d", len);
-
- GETCHAR(type, pckt);
- GETCHAR(opt_len, pckt);
-
- if (opt_len > 2)
- GETCHAR(delay, pckt);
-
- us->us_allowed |= (1 << type);
-
- switch(type) {
- case CB_CONF_NO:
- dbglog("no callback allowed");
- break;
-
- case CB_CONF_USER:
- dbglog("user callback allowed");
- if (opt_len > 4) {
- GETCHAR(addr_type, pckt);
- memcpy(address, pckt, opt_len - 4);
- address[opt_len - 4] = 0;
- if (address[0])
- dbglog("address: %s", address);
- }
- break;
-
- case CB_CONF_ADMIN:
- dbglog("user admin defined allowed");
- break;
-
- case CB_CONF_LIST:
- break;
- }
- len -= opt_len;
- }
-
- cbcp_resp(us);
-}
-
-static void
-cbcp_resp(us)
- cbcp_state *us;
-{
- u_char cb_type;
- u_char buf[256];
- u_char *bufp = buf;
- int len = 0;
-
- cb_type = us->us_allowed & us->us_type;
- dbglog("cbcp_resp cb_type=%d", cb_type);
-
-#if 0
- if (!cb_type)
- lcp_down(us->us_unit);
-#endif
-
- if (cb_type & ( 1 << CB_CONF_USER ) ) {
- dbglog("cbcp_resp CONF_USER");
- PUTCHAR(CB_CONF_USER, bufp);
- len = 3 + 1 + strlen(us->us_number) + 1;
- PUTCHAR(len , bufp);
- PUTCHAR(5, bufp); /* delay */
- PUTCHAR(1, bufp);
- BCOPY(us->us_number, bufp, strlen(us->us_number) + 1);
- cbcp_send(us, CBCP_RESP, buf, len);
- return;
- }
-
- if (cb_type & ( 1 << CB_CONF_ADMIN ) ) {
- dbglog("cbcp_resp CONF_ADMIN");
- PUTCHAR(CB_CONF_ADMIN, bufp);
- len = 3;
- PUTCHAR(len, bufp);
- PUTCHAR(5, bufp); /* delay */
- cbcp_send(us, CBCP_RESP, buf, len);
- return;
- }
-
- if (cb_type & ( 1 << CB_CONF_NO ) ) {
- dbglog("cbcp_resp CONF_NO");
- PUTCHAR(CB_CONF_NO, bufp);
- len = 3;
- PUTCHAR(len , bufp);
- PUTCHAR(0, bufp);
- cbcp_send(us, CBCP_RESP, buf, len);
- start_networks();
- return;
- }
-}
-
-static void
-cbcp_send(us, code, buf, len)
- cbcp_state *us;
- u_char code;
- u_char *buf;
- int len;
-{
- u_char *outp;
- int outlen;
-
- outp = outpacket_buf;
-
- outlen = 4 + len;
-
- MAKEHEADER(outp, PPP_CBCP);
-
- PUTCHAR(code, outp);
- PUTCHAR(us->us_id, outp);
- PUTSHORT(outlen, outp);
-
- if (len)
- BCOPY(buf, outp, len);
-
- output(us->us_unit, outpacket_buf, outlen + PPP_HDRLEN);
-}
-
-static void
-cbcp_recvack(us, pckt, len)
- cbcp_state *us;
- char *pckt;
- int len;
-{
- u_char type, delay, addr_type;
- int opt_len;
- char address[256];
-
- if (len) {
- GETCHAR(type, pckt);
- GETCHAR(opt_len, pckt);
-
- if (opt_len > 2)
- GETCHAR(delay, pckt);
-
- if (opt_len > 4) {
- GETCHAR(addr_type, pckt);
- memcpy(address, pckt, opt_len - 4);
- address[opt_len - 4] = 0;
- if (address[0])
- dbglog("peer will call: %s", address);
- }
- if (type == CB_CONF_NO)
- return;
- }
-
- cbcp_up(us);
-}
-
-/* ok peer will do callback */
-static void
-cbcp_up(us)
- cbcp_state *us;
-{
- persist = 0;
- lcp_close(0, "Call me back, please");
- status = EXIT_CALLBACK;
-}
diff --git a/c/src/libnetworking/pppd/cbcp.h b/c/src/libnetworking/pppd/cbcp.h
deleted file mode 100644
index c2ab3f6899..0000000000
--- a/c/src/libnetworking/pppd/cbcp.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef CBCP_H
-#define CBCP_H
-
-typedef struct cbcp_state {
- int us_unit; /* Interface unit number */
- u_char us_id; /* Current id */
- u_char us_allowed;
- int us_type;
- char *us_number; /* Telefone Number */
-} cbcp_state;
-
-extern cbcp_state cbcp[];
-
-extern struct protent cbcp_protent;
-
-#define CBCP_MINLEN 4
-
-#define CBCP_REQ 1
-#define CBCP_RESP 2
-#define CBCP_ACK 3
-
-#define CB_CONF_NO 1
-#define CB_CONF_USER 2
-#define CB_CONF_ADMIN 3
-#define CB_CONF_LIST 4
-#endif
diff --git a/c/src/libnetworking/pppd/ccp.c b/c/src/libnetworking/pppd/ccp.c
deleted file mode 100644
index 615950b901..0000000000
--- a/c/src/libnetworking/pppd/ccp.c
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*
- * ccp.c - PPP Compression Control Protocol.
- *
- * Copyright (c) 1994 The Australian National University.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies. This software is provided without any
- * warranty, express or implied. The Australian National University
- * makes no representations about the suitability of this software for
- * any purpose.
- *
- * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
- * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
- * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
- * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
- * OR MODIFICATIONS.
- */
-
-#define RCSID "$Id$"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "pppd.h"
-#include "fsm.h"
-#include "ccp.h"
-#include <net/ppp-comp.h>
-
-static const char rcsid[] = RCSID;
-
-/*
- * Command-line options.
- */
-static int setbsdcomp __P((char **));
-static int setdeflate __P((char **));
-
-static option_t ccp_option_list[] = {
- { "noccp", o_bool, &ccp_protent.enabled_flag,
- "Disable CCP negotiation" },
- { "-ccp", o_bool, &ccp_protent.enabled_flag,
- "Disable CCP negotiation" },
- { "bsdcomp", o_special, setbsdcomp,
- "Request BSD-Compress packet compression" },
- { "nobsdcomp", o_bool, &ccp_wantoptions[0].bsd_compress,
- "don't allow BSD-Compress", OPT_A2COPY,
- &ccp_allowoptions[0].bsd_compress },
- { "-bsdcomp", o_bool, &ccp_wantoptions[0].bsd_compress,
- "don't allow BSD-Compress", OPT_A2COPY,
- &ccp_allowoptions[0].bsd_compress },
- { "deflate", 1, setdeflate,
- "request Deflate compression" },
- { "nodeflate", o_bool, &ccp_wantoptions[0].deflate,
- "don't allow Deflate compression", OPT_A2COPY,
- &ccp_allowoptions[0].deflate },
- { "-deflate", o_bool, &ccp_wantoptions[0].deflate,
- "don't allow Deflate compression", OPT_A2COPY,
- &ccp_allowoptions[0].deflate },
- { "nodeflatedraft", o_bool, &ccp_wantoptions[0].deflate_draft,
- "don't use draft deflate #", OPT_A2COPY,
- &ccp_allowoptions[0].deflate_draft },
- { "predictor1", o_bool, &ccp_wantoptions[0].predictor_1,
- "request Predictor-1", 1, &ccp_allowoptions[0].predictor_1 },
- { "nopredictor1", o_bool, &ccp_wantoptions[0].predictor_1,
- "don't allow Predictor-1", OPT_A2COPY,
- &ccp_allowoptions[0].predictor_1 },
- { "-predictor1", o_bool, &ccp_wantoptions[0].predictor_1,
- "don't allow Predictor-1", OPT_A2COPY,
- &ccp_allowoptions[0].predictor_1 },
-
- { NULL }
-};
-
-/*
- * Protocol entry points from main code.
- */
-static void ccp_init __P((int unit));
-static void ccp_open __P((int unit));
-static void ccp_close __P((int unit, char *));
-static void ccp_lowerup __P((int unit));
-static void ccp_lowerdown __P((int));
-static void ccp_input __P((int unit, u_char *pkt, int len));
-static void ccp_protrej __P((int unit));
-static int ccp_printpkt __P((u_char *pkt, int len,
- void (*printer) __P((void *, char *, ...)),
- void *arg));
-static void ccp_datainput __P((int unit, u_char *pkt, int len));
-
-struct protent ccp_protent = {
- PPP_CCP,
- ccp_init,
- ccp_input,
- ccp_protrej,
- ccp_lowerup,
- ccp_lowerdown,
- ccp_open,
- ccp_close,
- ccp_printpkt,
- ccp_datainput,
- 1,
- "CCP",
- "Compressed",
- ccp_option_list,
- NULL,
- NULL,
- NULL
-};
-
-fsm ccp_fsm[NUM_PPP];
-ccp_options ccp_wantoptions[NUM_PPP]; /* what to request the peer to use */
-ccp_options ccp_gotoptions[NUM_PPP]; /* what the peer agreed to do */
-ccp_options ccp_allowoptions[NUM_PPP]; /* what we'll agree to do */
-ccp_options ccp_hisoptions[NUM_PPP]; /* what we agreed to do */
-
-/*
- * Callbacks for fsm code.
- */
-static void ccp_resetci __P((fsm *));
-static int ccp_cilen __P((fsm *));
-static void ccp_addci __P((fsm *, u_char *, int *));
-static int ccp_ackci __P((fsm *, u_char *, int));
-static int ccp_nakci __P((fsm *, u_char *, int));
-static int ccp_rejci __P((fsm *, u_char *, int));
-static int ccp_reqci __P((fsm *, u_char *, int *, int));
-static void ccp_up __P((fsm *));
-static void ccp_down __P((fsm *));
-static int ccp_extcode __P((fsm *, int, int, u_char *, int));
-static void ccp_rack_timeout __P((void *));
-static char *method_name __P((ccp_options *, ccp_options *));
-
-static fsm_callbacks ccp_callbacks = {
- ccp_resetci,
- ccp_cilen,
- ccp_addci,
- ccp_ackci,
- ccp_nakci,
- ccp_rejci,
- ccp_reqci,
- ccp_up,
- ccp_down,
- NULL,
- NULL,
- NULL,
- NULL,
- ccp_extcode,
- "CCP"
-};
-
-/*
- * Do we want / did we get any compression?
- */
-#define ANY_COMPRESS(opt) ((opt).deflate || (opt).bsd_compress \
- || (opt).predictor_1 || (opt).predictor_2)
-
-/*
- * Local state (mainly for handling reset-reqs and reset-acks).
- */
-static int ccp_localstate[NUM_PPP];
-#define RACK_PENDING 1 /* waiting for reset-ack */
-#define RREQ_REPEAT 2 /* send another reset-req if no reset-ack */
-
-#define RACKTIMEOUT 1 /* second */
-
-static int all_rejected[NUM_PPP]; /* we rejected all peer's options */
-
-/*
- * Option parsing.
- */
-static int
-setbsdcomp(argv)
- char **argv;
-{
- int rbits, abits;
- char *str, *endp;
-
- str = *argv;
- abits = rbits = strtol(str, &endp, 0);
- if (endp != str && *endp == ',') {
- str = endp + 1;
- abits = strtol(str, &endp, 0);
- }
- if (*endp != 0 || endp == str) {
- option_error("invalid parameter '%s' for bsdcomp option", *argv);
- return 0;
- }
- if ((rbits != 0 && (rbits < BSD_MIN_BITS || rbits > BSD_MAX_BITS))
- || (abits != 0 && (abits < BSD_MIN_BITS || abits > BSD_MAX_BITS))) {
- option_error("bsdcomp option values must be 0 or %d .. %d",
- BSD_MIN_BITS, BSD_MAX_BITS);
- return 0;
- }
- if (rbits > 0) {
- ccp_wantoptions[0].bsd_compress = 1;
- ccp_wantoptions[0].bsd_bits = rbits;
- } else
- ccp_wantoptions[0].bsd_compress = 0;
- if (abits > 0) {
- ccp_allowoptions[0].bsd_compress = 1;
- ccp_allowoptions[0].bsd_bits = abits;
- } else
- ccp_allowoptions[0].bsd_compress = 0;
- return 1;
-}
-
-static int
-setdeflate(argv)
- char **argv;
-{
- int rbits, abits;
- char *str, *endp;
-
- str = *argv;
- abits = rbits = strtol(str, &endp, 0);
- if (endp != str && *endp == ',') {
- str = endp + 1;
- abits = strtol(str, &endp, 0);
- }
- if (*endp != 0 || endp == str) {
- option_error("invalid parameter '%s' for deflate option", *argv);
- return 0;
- }
- if ((rbits != 0 && (rbits < DEFLATE_MIN_SIZE || rbits > DEFLATE_MAX_SIZE))
- || (abits != 0 && (abits < DEFLATE_MIN_SIZE
- || abits > DEFLATE_MAX_SIZE))) {
- option_error("deflate option values must be 0 or %d .. %d",
- DEFLATE_MIN_SIZE, DEFLATE_MAX_SIZE);
- return 0;
- }
- if (rbits > 0) {
- ccp_wantoptions[0].deflate = 1;
- ccp_wantoptions[0].deflate_size = rbits;
- } else
- ccp_wantoptions[0].deflate = 0;
- if (abits > 0) {
- ccp_allowoptions[0].deflate = 1;
- ccp_allowoptions[0].deflate_size = abits;
- } else
- ccp_allowoptions[0].deflate = 0;
- return 1;
-}
-
-
-/*
- * ccp_init - initialize CCP.
- */
-static void
-ccp_init(unit)
- int unit;
-{
- fsm *f = &ccp_fsm[unit];
-
- f->unit = unit;
- f->protocol = PPP_CCP;
- f->callbacks = &ccp_callbacks;
- fsm_init(f);
-
- memset(&ccp_wantoptions[unit], 0, sizeof(ccp_options));
- memset(&ccp_gotoptions[unit], 0, sizeof(ccp_options));
- memset(&ccp_allowoptions[unit], 0, sizeof(ccp_options));
- memset(&ccp_hisoptions[unit], 0, sizeof(ccp_options));
-
- ccp_wantoptions[0].deflate = 1;
- ccp_wantoptions[0].deflate_size = DEFLATE_MAX_SIZE;
- ccp_wantoptions[0].deflate_correct = 1;
- ccp_wantoptions[0].deflate_draft = 1;
- ccp_allowoptions[0].deflate = 1;
- ccp_allowoptions[0].deflate_size = DEFLATE_MAX_SIZE;
- ccp_allowoptions[0].deflate_correct = 1;
- ccp_allowoptions[0].deflate_draft = 1;
-
- ccp_wantoptions[0].bsd_compress = 1;
- ccp_wantoptions[0].bsd_bits = BSD_MAX_BITS;
- ccp_allowoptions[0].bsd_compress = 1;
- ccp_allowoptions[0].bsd_bits = BSD_MAX_BITS;
-
- ccp_allowoptions[0].predictor_1 = 1;
-}
-
-/*
- * ccp_open - CCP is allowed to come up.
- */
-static void
-ccp_open(unit)
- int unit;
-{
- fsm *f = &ccp_fsm[unit];
-
- if (f->state != OPENED)
- ccp_flags_set(unit, 1, 0);
-
- /*
- * Find out which compressors the kernel supports before
- * deciding whether to open in silent mode.
- */
- ccp_resetci(f);
- if (!ANY_COMPRESS(ccp_gotoptions[unit]))
- f->flags |= OPT_SILENT;
-
- fsm_open(f);
-}
-
-/*
- * ccp_close - Terminate CCP.
- */
-static void
-ccp_close(unit, reason)
- int unit;
- char *reason;
-{
- ccp_flags_set(unit, 0, 0);
- fsm_close(&ccp_fsm[unit], reason);
-}
-
-/*
- * ccp_lowerup - we may now transmit CCP packets.
- */
-static void
-ccp_lowerup(unit)
- int unit;
-{
- fsm_lowerup(&ccp_fsm[unit]);
-}
-
-/*
- * ccp_lowerdown - we may not transmit CCP packets.
- */
-static void
-ccp_lowerdown(unit)
- int unit;
-{
- fsm_lowerdown(&ccp_fsm[unit]);
-}
-
-/*
- * ccp_input - process a received CCP packet.
- */
-static void
-ccp_input(unit, p, len)
- int unit;
- u_char *p;
- int len;
-{
- fsm *f = &ccp_fsm[unit];
- int oldstate;
-
- /*
- * Check for a terminate-request so we can print a message.
- */
- oldstate = f->state;
- fsm_input(f, p, len);
- if (oldstate == OPENED && p[0] == TERMREQ && f->state != OPENED)
- notice("Compression disabled by peer.");
-
- /*
- * If we get a terminate-ack and we're not asking for compression,
- * close CCP.
- */
- if (oldstate == REQSENT && p[0] == TERMACK
- && !ANY_COMPRESS(ccp_gotoptions[unit]))
- ccp_close(unit, "No compression negotiated");
-}
-
-/*
- * Handle a CCP-specific code.
- */
-static int
-ccp_extcode(f, code, id, p, len)
- fsm *f;
- int code, id;
- u_char *p;
- int len;
-{
- switch (code) {
- case CCP_RESETREQ:
- if (f->state != OPENED)
- break;
- /* send a reset-ack, which the transmitter will see and
- reset its compression state. */
- fsm_sdata(f, CCP_RESETACK, id, NULL, 0);
- break;
-
- case CCP_RESETACK:
- if (ccp_localstate[f->unit] & RACK_PENDING && id == f->reqid) {
- ccp_localstate[f->unit] &= ~(RACK_PENDING | RREQ_REPEAT);
- UNTIMEOUT(ccp_rack_timeout, f);
- }
- break;
-
- default:
- return 0;
- }
-
- return 1;
-}
-
-/*
- * ccp_protrej - peer doesn't talk CCP.
- */
-static void
-ccp_protrej(unit)
- int unit;
-{
- ccp_flags_set(unit, 0, 0);
- fsm_lowerdown(&ccp_fsm[unit]);
-}
-
-/*
- * ccp_resetci - initialize at start of negotiation.
- */
-static void
-ccp_resetci(f)
- fsm *f;
-{
- ccp_options *go = &ccp_gotoptions[f->unit];
- u_char opt_buf[16];
-
- *go = ccp_wantoptions[f->unit];
- all_rejected[f->unit] = 0;
-
- /*
- * Check whether the kernel knows about the various
- * compression methods we might request.
- */
- if (go->bsd_compress) {
- opt_buf[0] = CI_BSD_COMPRESS;
- opt_buf[1] = CILEN_BSD_COMPRESS;
- opt_buf[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, BSD_MIN_BITS);
- if (ccp_test(f->unit, opt_buf, CILEN_BSD_COMPRESS, 0) <= 0)
- go->bsd_compress = 0;
- }
- if (go->deflate) {
- if (go->deflate_correct) {
- opt_buf[0] = CI_DEFLATE;
- opt_buf[1] = CILEN_DEFLATE;
- opt_buf[2] = DEFLATE_MAKE_OPT(DEFLATE_MIN_SIZE);
- opt_buf[3] = DEFLATE_CHK_SEQUENCE;
- if (ccp_test(f->unit, opt_buf, CILEN_DEFLATE, 0) <= 0)
- go->deflate_correct = 0;
- }
- if (go->deflate_draft) {
- opt_buf[0] = CI_DEFLATE_DRAFT;
- opt_buf[1] = CILEN_DEFLATE;
- opt_buf[2] = DEFLATE_MAKE_OPT(DEFLATE_MIN_SIZE);
- opt_buf[3] = DEFLATE_CHK_SEQUENCE;
- if (ccp_test(f->unit, opt_buf, CILEN_DEFLATE, 0) <= 0)
- go->deflate_draft = 0;
- }
- if (!go->deflate_correct && !go->deflate_draft)
- go->deflate = 0;
- }
- if (go->predictor_1) {
- opt_buf[0] = CI_PREDICTOR_1;
- opt_buf[1] = CILEN_PREDICTOR_1;
- if (ccp_test(f->unit, opt_buf, CILEN_PREDICTOR_1, 0) <= 0)
- go->predictor_1 = 0;
- }
- if (go->predictor_2) {
- opt_buf[0] = CI_PREDICTOR_2;
- opt_buf[1] = CILEN_PREDICTOR_2;
- if (ccp_test(f->unit, opt_buf, CILEN_PREDICTOR_2, 0) <= 0)
- go->predictor_2 = 0;
- }
-}
-
-/*
- * ccp_cilen - Return total length of our configuration info.
- */
-static int
-ccp_cilen(f)
- fsm *f;
-{
- ccp_options *go = &ccp_gotoptions[f->unit];
-
- return (go->bsd_compress? CILEN_BSD_COMPRESS: 0)
- + (go->deflate? CILEN_DEFLATE: 0)
- + (go->predictor_1? CILEN_PREDICTOR_1: 0)
- + (go->predictor_2? CILEN_PREDICTOR_2: 0);
-}
-
-/*
- * ccp_addci - put our requests in a packet.
- */
-static void
-ccp_addci(f, p, lenp)
- fsm *f;
- u_char *p;
- int *lenp;
-{
- int res;
- ccp_options *go = &ccp_gotoptions[f->unit];
- u_char *p0 = p;
-
- /*
- * Add the compression types that we can receive, in decreasing
- * preference order. Get the kernel to allocate the first one
- * in case it gets Acked.
- */
- if (go->deflate) {
- p[0] = go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT;
- p[1] = CILEN_DEFLATE;
- p[2] = DEFLATE_MAKE_OPT(go->deflate_size);
- p[3] = DEFLATE_CHK_SEQUENCE;
- for (;;) {
- res = ccp_test(f->unit, p, CILEN_DEFLATE, 0);
- if (res > 0) {
- p += CILEN_DEFLATE;
- break;
- }
- if (res < 0 || go->deflate_size <= DEFLATE_MIN_SIZE) {
- go->deflate = 0;
- break;
- }
- --go->deflate_size;
- p[2] = DEFLATE_MAKE_OPT(go->deflate_size);
- }
- if (p != p0 && go->deflate_correct && go->deflate_draft) {
- p[0] = CI_DEFLATE_DRAFT;
- p[1] = CILEN_DEFLATE;
- p[2] = p[2 - CILEN_DEFLATE];
- p[3] = DEFLATE_CHK_SEQUENCE;
- p += CILEN_DEFLATE;
- }
- }
- if (go->bsd_compress) {
- p[0] = CI_BSD_COMPRESS;
- p[1] = CILEN_BSD_COMPRESS;
- p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits);
- if (p != p0) {
- p += CILEN_BSD_COMPRESS; /* not the first option */
- } else {
- for (;;) {
- res = ccp_test(f->unit, p, CILEN_BSD_COMPRESS, 0);
- if (res > 0) {
- p += CILEN_BSD_COMPRESS;
- break;
- }
- if (res < 0 || go->bsd_bits <= BSD_MIN_BITS) {
- go->bsd_compress = 0;
- break;
- }
- --go->bsd_bits;
- p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits);
- }
- }
- }
- /* XXX Should Predictor 2 be preferable to Predictor 1? */
- if (go->predictor_1) {
- p[0] = CI_PREDICTOR_1;
- p[1] = CILEN_PREDICTOR_1;
- if (p == p0 && ccp_test(f->unit, p, CILEN_PREDICTOR_1, 0) <= 0) {
- go->predictor_1 = 0;
- } else {
- p += CILEN_PREDICTOR_1;
- }
- }
- if (go->predictor_2) {
- p[0] = CI_PREDICTOR_2;
- p[1] = CILEN_PREDICTOR_2;
- if (p == p0 && ccp_test(f->unit, p, CILEN_PREDICTOR_2, 0) <= 0) {
- go->predictor_2 = 0;
- } else {
- p += CILEN_PREDICTOR_2;
- }
- }
-
- go->method = (p > p0)? p0[0]: -1;
-
- *lenp = p - p0;
-}
-
-/*
- * ccp_ackci - process a received configure-ack, and return
- * 1 iff the packet was OK.
- */
-static int
-ccp_ackci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- ccp_options *go = &ccp_gotoptions[f->unit];
- u_char *p0 = p;
-
- if (go->deflate) {
- if (len < CILEN_DEFLATE
- || p[0] != (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)
- || p[1] != CILEN_DEFLATE
- || p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
- || p[3] != DEFLATE_CHK_SEQUENCE)
- return 0;
- p += CILEN_DEFLATE;
- len -= CILEN_DEFLATE;
- /* XXX Cope with first/fast ack */
- if (len == 0)
- return 1;
- if (go->deflate_correct && go->deflate_draft) {
- if (len < CILEN_DEFLATE
- || p[0] != CI_DEFLATE_DRAFT
- || p[1] != CILEN_DEFLATE
- || p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
- || p[3] != DEFLATE_CHK_SEQUENCE)
- return 0;
- p += CILEN_DEFLATE;
- len -= CILEN_DEFLATE;
- }
- }
- if (go->bsd_compress) {
- if (len < CILEN_BSD_COMPRESS
- || p[0] != CI_BSD_COMPRESS || p[1] != CILEN_BSD_COMPRESS
- || p[2] != BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits))
- return 0;
- p += CILEN_BSD_COMPRESS;
- len -= CILEN_BSD_COMPRESS;
- /* XXX Cope with first/fast ack */
- if (p == p0 && len == 0)
- return 1;
- }
- if (go->predictor_1) {
- if (len < CILEN_PREDICTOR_1
- || p[0] != CI_PREDICTOR_1 || p[1] != CILEN_PREDICTOR_1)
- return 0;
- p += CILEN_PREDICTOR_1;
- len -= CILEN_PREDICTOR_1;
- /* XXX Cope with first/fast ack */
- if (p == p0 && len == 0)
- return 1;
- }
- if (go->predictor_2) {
- if (len < CILEN_PREDICTOR_2
- || p[0] != CI_PREDICTOR_2 || p[1] != CILEN_PREDICTOR_2)
- return 0;
- p += CILEN_PREDICTOR_2;
- len -= CILEN_PREDICTOR_2;
- /* XXX Cope with first/fast ack */
- if (p == p0 && len == 0)
- return 1;
- }
-
- if (len != 0)
- return 0;
- return 1;
-}
-
-/*
- * ccp_nakci - process received configure-nak.
- * Returns 1 iff the nak was OK.
- */
-static int
-ccp_nakci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- ccp_options *go = &ccp_gotoptions[f->unit];
- ccp_options no; /* options we've seen already */
- ccp_options try; /* options to ask for next time */
-
- memset(&no, 0, sizeof(no));
- try = *go;
-
- if (go->deflate && len >= CILEN_DEFLATE
- && p[0] == (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)
- && p[1] == CILEN_DEFLATE) {
- no.deflate = 1;
- /*
- * Peer wants us to use a different code size or something.
- * Stop asking for Deflate if we don't understand his suggestion.
- */
- if (DEFLATE_METHOD(p[2]) != DEFLATE_METHOD_VAL
- || DEFLATE_SIZE(p[2]) < DEFLATE_MIN_SIZE
- || p[3] != DEFLATE_CHK_SEQUENCE)
- try.deflate = 0;
- else if (DEFLATE_SIZE(p[2]) < go->deflate_size)
- try.deflate_size = DEFLATE_SIZE(p[2]);
- p += CILEN_DEFLATE;
- len -= CILEN_DEFLATE;
- if (go->deflate_correct && go->deflate_draft
- && len >= CILEN_DEFLATE && p[0] == CI_DEFLATE_DRAFT
- && p[1] == CILEN_DEFLATE) {
- p += CILEN_DEFLATE;
- len -= CILEN_DEFLATE;
- }
- }
-
- if (go->bsd_compress && len >= CILEN_BSD_COMPRESS
- && p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD_COMPRESS) {
- no.bsd_compress = 1;
- /*
- * Peer wants us to use a different number of bits
- * or a different version.
- */
- if (BSD_VERSION(p[2]) != BSD_CURRENT_VERSION)
- try.bsd_compress = 0;
- else if (BSD_NBITS(p[2]) < go->bsd_bits)
- try.bsd_bits = BSD_NBITS(p[2]);
- p += CILEN_BSD_COMPRESS;
- len -= CILEN_BSD_COMPRESS;
- }
-
- /*
- * Predictor-1 and 2 have no options, so they can't be Naked.
- *
- * There may be remaining options but we ignore them.
- */
-
- if (f->state != OPENED)
- *go = try;
- return 1;
-}
-
-/*
- * ccp_rejci - reject some of our suggested compression methods.
- */
-static int
-ccp_rejci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- ccp_options *go = &ccp_gotoptions[f->unit];
- ccp_options try; /* options to request next time */
-
- try = *go;
-
- /*
- * Cope with empty configure-rejects by ceasing to send
- * configure-requests.
- */
- if (len == 0 && all_rejected[f->unit])
- return -1;
-
- if (go->deflate && len >= CILEN_DEFLATE
- && p[0] == (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)
- && p[1] == CILEN_DEFLATE) {
- if (p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
- || p[3] != DEFLATE_CHK_SEQUENCE)
- return 0; /* Rej is bad */
- if (go->deflate_correct)
- try.deflate_correct = 0;
- else
- try.deflate_draft = 0;
- p += CILEN_DEFLATE;
- len -= CILEN_DEFLATE;
- if (go->deflate_correct && go->deflate_draft
- && len >= CILEN_DEFLATE && p[0] == CI_DEFLATE_DRAFT
- && p[1] == CILEN_DEFLATE) {
- if (p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
- || p[3] != DEFLATE_CHK_SEQUENCE)
- return 0; /* Rej is bad */
- try.deflate_draft = 0;
- p += CILEN_DEFLATE;
- len -= CILEN_DEFLATE;
- }
- if (!try.deflate_correct && !try.deflate_draft)
- try.deflate = 0;
- }
- if (go->bsd_compress && len >= CILEN_BSD_COMPRESS
- && p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD_COMPRESS) {
- if (p[2] != BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits))
- return 0;
- try.bsd_compress = 0;
- p += CILEN_BSD_COMPRESS;
- len -= CILEN_BSD_COMPRESS;
- }
- if (go->predictor_1 && len >= CILEN_PREDICTOR_1
- && p[0] == CI_PREDICTOR_1 && p[1] == CILEN_PREDICTOR_1) {
- try.predictor_1 = 0;
- p += CILEN_PREDICTOR_1;
- len -= CILEN_PREDICTOR_1;
- }
- if (go->predictor_2 && len >= CILEN_PREDICTOR_2
- && p[0] == CI_PREDICTOR_2 && p[1] == CILEN_PREDICTOR_2) {
- try.predictor_2 = 0;
- p += CILEN_PREDICTOR_2;
- len -= CILEN_PREDICTOR_2;
- }
-
- if (len != 0)
- return 0;
-
- if (f->state != OPENED)
- *go = try;
-
- return 1;
-}
-
-/*
- * ccp_reqci - processed a received configure-request.
- * Returns CONFACK, CONFNAK or CONFREJ and the packet modified
- * appropriately.
- */
-static int
-ccp_reqci(f, p, lenp, dont_nak)
- fsm *f;
- u_char *p;
- int *lenp;
- int dont_nak;
-{
- int ret, newret, res;
- u_char *p0, *retp;
- int len, clen, type, nb;
- ccp_options *ho = &ccp_hisoptions[f->unit];
- ccp_options *ao = &ccp_allowoptions[f->unit];
-
- ret = CONFACK;
- retp = p0 = p;
- len = *lenp;
-
- memset(ho, 0, sizeof(ccp_options));
- ho->method = (len > 0)? p[0]: -1;
-
- while (len > 0) {
- newret = CONFACK;
- if (len < 2 || p[1] < 2 || p[1] > len) {
- /* length is bad */
- clen = len;
- newret = CONFREJ;
-
- } else {
- type = p[0];
- clen = p[1];
-
- switch (type) {
- case CI_DEFLATE:
- case CI_DEFLATE_DRAFT:
- if (!ao->deflate || clen != CILEN_DEFLATE
- || (!ao->deflate_correct && type == CI_DEFLATE)
- || (!ao->deflate_draft && type == CI_DEFLATE_DRAFT)) {
- newret = CONFREJ;
- break;
- }
-
- ho->deflate = 1;
- ho->deflate_size = nb = DEFLATE_SIZE(p[2]);
- if (DEFLATE_METHOD(p[2]) != DEFLATE_METHOD_VAL
- || p[3] != DEFLATE_CHK_SEQUENCE
- || nb > ao->deflate_size || nb < DEFLATE_MIN_SIZE) {
- newret = CONFNAK;
- if (!dont_nak) {
- p[2] = DEFLATE_MAKE_OPT(ao->deflate_size);
- p[3] = DEFLATE_CHK_SEQUENCE;
- /* fall through to test this #bits below */
- } else
- break;
- }
-
- /*
- * Check whether we can do Deflate with the window
- * size they want. If the window is too big, reduce
- * it until the kernel can cope and nak with that.
- * We only check this for the first option.
- */
- if (p == p0) {
- for (;;) {
- res = ccp_test(f->unit, p, CILEN_DEFLATE, 1);
- if (res > 0)
- break; /* it's OK now */
- if (res < 0 || nb == DEFLATE_MIN_SIZE || dont_nak) {
- newret = CONFREJ;
- p[2] = DEFLATE_MAKE_OPT(ho->deflate_size);
- break;
- }
- newret = CONFNAK;
- --nb;
- p[2] = DEFLATE_MAKE_OPT(nb);
- }
- }
- break;
-
- case CI_BSD_COMPRESS:
- if (!ao->bsd_compress || clen != CILEN_BSD_COMPRESS) {
- newret = CONFREJ;
- break;
- }
-
- ho->bsd_compress = 1;
- ho->bsd_bits = nb = BSD_NBITS(p[2]);
- if (BSD_VERSION(p[2]) != BSD_CURRENT_VERSION
- || nb > ao->bsd_bits || nb < BSD_MIN_BITS) {
- newret = CONFNAK;
- if (!dont_nak) {
- p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, ao->bsd_bits);
- /* fall through to test this #bits below */
- } else
- break;
- }
-
- /*
- * Check whether we can do BSD-Compress with the code
- * size they want. If the code size is too big, reduce
- * it until the kernel can cope and nak with that.
- * We only check this for the first option.
- */
- if (p == p0) {
- for (;;) {
- res = ccp_test(f->unit, p, CILEN_BSD_COMPRESS, 1);
- if (res > 0)
- break;
- if (res < 0 || nb == BSD_MIN_BITS || dont_nak) {
- newret = CONFREJ;
- p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION,
- ho->bsd_bits);
- break;
- }
- newret = CONFNAK;
- --nb;
- p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, nb);
- }
- }
- break;
-
- case CI_PREDICTOR_1:
- if (!ao->predictor_1 || clen != CILEN_PREDICTOR_1) {
- newret = CONFREJ;
- break;
- }
-
- ho->predictor_1 = 1;
- if (p == p0
- && ccp_test(f->unit, p, CILEN_PREDICTOR_1, 1) <= 0) {
- newret = CONFREJ;
- }
- break;
-
- case CI_PREDICTOR_2:
- if (!ao->predictor_2 || clen != CILEN_PREDICTOR_2) {
- newret = CONFREJ;
- break;
- }
-
- ho->predictor_2 = 1;
- if (p == p0
- && ccp_test(f->unit, p, CILEN_PREDICTOR_2, 1) <= 0) {
- newret = CONFREJ;
- }
- break;
-
- default:
- newret = CONFREJ;
- }
- }
-
- if (newret == CONFNAK && dont_nak)
- newret = CONFREJ;
- if (!(newret == CONFACK || (newret == CONFNAK && ret == CONFREJ))) {
- /* we're returning this option */
- if (newret == CONFREJ && ret == CONFNAK)
- retp = p0;
- ret = newret;
- if (p != retp)
- BCOPY(p, retp, clen);
- retp += clen;
- }
-
- p += clen;
- len -= clen;
- }
-
- if (ret != CONFACK) {
- if (ret == CONFREJ && *lenp == retp - p0)
- all_rejected[f->unit] = 1;
- else
- *lenp = retp - p0;
- }
- return ret;
-}
-
-/*
- * Make a string name for a compression method (or 2).
- */
-static char *
-method_name(opt, opt2)
- ccp_options *opt, *opt2;
-{
- static char result[64];
-
- if (!ANY_COMPRESS(*opt))
- return "(none)";
- switch (opt->method) {
- case CI_DEFLATE:
- case CI_DEFLATE_DRAFT:
- if (opt2 != NULL && opt2->deflate_size != opt->deflate_size)
- slprintf(result, sizeof(result), "Deflate%s (%d/%d)",
- (opt->method == CI_DEFLATE_DRAFT? "(old#)": ""),
- opt->deflate_size, opt2->deflate_size);
- else
- slprintf(result, sizeof(result), "Deflate%s (%d)",
- (opt->method == CI_DEFLATE_DRAFT? "(old#)": ""),
- opt->deflate_size);
- break;
- case CI_BSD_COMPRESS:
- if (opt2 != NULL && opt2->bsd_bits != opt->bsd_bits)
- slprintf(result, sizeof(result), "BSD-Compress (%d/%d)",
- opt->bsd_bits, opt2->bsd_bits);
- else
- slprintf(result, sizeof(result), "BSD-Compress (%d)",
- opt->bsd_bits);
- break;
- case CI_PREDICTOR_1:
- return "Predictor 1";
- case CI_PREDICTOR_2:
- return "Predictor 2";
- default:
- slprintf(result, sizeof(result), "Method %d", opt->method);
- }
- return result;
-}
-
-/*
- * CCP has come up - inform the kernel driver and log a message.
- */
-static void
-ccp_up(f)
- fsm *f;
-{
- ccp_options *go = &ccp_gotoptions[f->unit];
- ccp_options *ho = &ccp_hisoptions[f->unit];
- char method1[64];
-
- ccp_flags_set(f->unit, 1, 1);
- if (ANY_COMPRESS(*go)) {
- if (ANY_COMPRESS(*ho)) {
- if (go->method == ho->method) {
- notice("%s compression enabled", method_name(go, ho));
- } else {
- strlcpy(method1, method_name(go, NULL), sizeof(method1));
- notice("%s / %s compression enabled",
- method1, method_name(ho, NULL));
- }
- } else
- notice("%s receive compression enabled", method_name(go, NULL));
- } else if (ANY_COMPRESS(*ho))
- notice("%s transmit compression enabled", method_name(ho, NULL));
-}
-
-/*
- * CCP has gone down - inform the kernel driver.
- */
-static void
-ccp_down(f)
- fsm *f;
´7sr 2TÄ¥IôiCzì€Èö€0F*ºxœ³)d$B±->鮆ò 1Loïsÿ ÷K2HCAl‡ñ?Nò;uÐ_À+@È!„B~Ÿ‡„Õ/ªL-ÝœÒaÀpúðú5A"Q¶Á³Mf°ÀUk-m4Òš"¶óS!(Æ)¹­Y.ûI€ß€Æ'ùËühÐÃ#²{¡OÁ"¼`B}£AàAû£òÄøºÅ8Áúïçʼ”Ä;0ä(<þ¿N V1æZ4Š¡díØòCa»JÆœ^m€’Äò>*==Æ?ªU^ïxkä§ 3ÎyþãÙ‘¥ë ':ujP†Y´ …Ò™Hd2”m”£A)ņ¤ª\”8ØWv®ŹYöeƒxY IZ€§t‚o_Hœò£ $€[àv¼ oµ;›±2¢àæUM`c : Ëe¼"Z ÓIï`A€P¾‡ûðThAwêõ6Á€œ¿AÄ?ƒPR:vE̳5ÎD=# ôƒ‰ŸP¥10A4·×í `„^2 OW(­ ´[RùŠÀBžè|ÎÃë”Rb‚ô¤&Ç„ sŒ y »î6‡eoˆ˜kè“4°xJl…CAÊÁ9ˆ¥P‰Þnª›âQ=€ˆuì ™¡ Jh)Œè2Gùc]B{Ž½Ár‹ÜOT DíôžxPÞö*¨’Žˆ¸€ëä;¢†ëŽ¿Uz€P'†ÇéEORgH£¨ãQ!˜¢ÈB¼³97°ÅDx5&#„º`l¦¨”SJü_4$ê:„ ¶‹!Ëþžø–<^$8<àâœAãY>)SÞv©ÌM<à¥'P*TˆoM*$n|‡QÔ3Êŧ3*1w)I%*·/×õ¯¢Õñ»Õƒ KÊFAP†óDÞÁcäIPÅ)û¡ê”]¦‰€ 4%ˆ÷`;¢/—ìD1”I‚’‚`HFF6/L‡d‡Õí1óA`D˜ ä0Oõ0 'mþ?÷L-¸š”½Ð$”S±"oãR’çÐ`:•SÆQV„W!rE…÷#ÐrŽraE¦CSŠHûFÎI@I ~›(‘£ P¬‚m9^eŽ•Â|éá²ô¡AáãÃ_ËÏ2eBV+ ¹I Sü!÷‘ϨÝþ{ðI¸päÁn-AÉ Vi<ð€a§Z’wµR† !w8 !˜v—ƒp~›ª ‚ ƒªl ˆ€‰0 mç^ð×".R&!Eï+ÃÕ6DùÔ†f¹–Í Ñ4§˜/ÄÝ‚|**%I%ë93+kÉ¡„Ë31…ahƒûĘM¶&Q)•),–Ò—MÄkãÜÑPAnt7ìG²;“—˜Âƒ1%3ôš $?Ãßýü·‡¼îªŸ¸ç Þ`ó´ eˆL¢r,ò"J8‰ $ˆZP$ãÉÌ3YE-±ë®©•Ë©%X0m˜CTèŒÇX&„„¤ˆ|srP42l’¸ÀÅJD…QËÙ†ñÆp” Š’™©I’Yh"D%žS‰+)E¤³mÒë"beJÊø7 RX]“0rÈ‘‰¥“oä“%4Ú¯ƒš”0ªÚS&V’}Ö»«¶cJ÷Öíf¾.)E•'ë—:êík„ÒÍ6׶®E{UÒ4ZfY-cf”LTÛE‹ÕÕÓ Y!5°j-æêêÊ“  ¥cl-£d(‘ IFi¡IêëˆÔY´`aBI•,¤¹m¹KkE¥f‹5&²ƒm“&MÅérF·6®]×R[¡q (H‡|Ái@2®ÂÕ­&ÚKj.©·Áä± ÞÖ»3_å±6‘-™IJ°/а´¸™t\Ñ*¸6•ؘ“hØ«uVûnl›CÛ`›| M§S”/™1ECQP‚ ƒVTK@rÇÞ ˆÉ)QäJô:#æ*^.JJé”w‘Ù‘Ü!… Â\”R=¡–ŠTŒl %a3K&°@o"™ ý¡Û³î–xHÂ¥è©B{uÑʆ®PØ"‚BÑ° Uë ž9‘SùA6?¢’ÕK=Çv8|‹#NH#Î(ÓJ4 ûãŪ¹7¿^Ûfö!ŒŒ*¥£RC›òô} ºÙÍ–€›F¸^e¡¸S2:aŠ&ÈÚ­+Y%FÔQb„Še€•‰•¦hm).RAŒÐÄP!âsûLqÀDÀžï% à*ì*†ð[Sìt‘7@Ú$"V–È €` K ŠY-,° ®ÇBÂf›M-–Ub$ºÆ +kX«aÀ@Z„K`ÅJP˜¤ Ím±†¶#QLaXì,˜$›[@šB«[hÛGsÖE%bÚ秋ÇY¯%xÞZ,liDÈXYˆá2jáL&¬‘Œˆ”e…‹!”´m ˆÛ L\„¡X’–1 jEÈŽ`ÁVÃ&VPLÉhLĦ2øék{”JÀBF”L3fHàœ®K‚àèL6QÇw‹êBÈLKëÃ"I)îLH „ \ €‡·¿X²ÑE'œ\¢¿J%2 Hß=Sçïàïš"é!÷@™(Ä~Ÿx¸£oxy„EaDIãäY#™eºDÃ%¸%Þñ) a¼3d˜ƒ”­U2ÓRÑ‚oFì6 ·[L¥5 ©‰0Ì–´ÖóÃTÞ·Œ! á°Á£gp´Ï—Ùóa袪8þrA¼ üéâ}q→‡Ê(ü‡šI§¥›É>â(«ûæb>`Љü0Pã`zla¡Ø kC̾ ±q¤Æ)L1Ä#þ—šƒéˆºÊ˜V¤Š‹3%£ˆÕJwí¢1A¤Šxù0P¥¾ÓÝ!G|'ae¬ 6>7@ çìqåáãìLb þoÃBöH°SÞ!Û)B4*ÒT”/RSmŽR-OÐ|L@ÿQÔ¥)IÑ\îӹݢî×Ø×”‘±¼ÔR%de$ÕÛ·uÒêûëjAÎF ¸UñjC͈†vž‹çXl=€PSΠù~Ñ P¸€/Ò©²0˺‰Ày´ Á¾È<Ñù~°Q_µ6)1k¹j91rç<2Òp,"€n~uerÜÐhçYr¬cH¢ë9q%Æ[l± 78{ñ—eYL™R"P’y è!îÜä™î/õþ0¨‚€€‚îÇ!snÓ0¦„K߆:Œ1LW ÄÊ ŠQ‡ ñ9 HSEQ°÷ùŽHx’)JhF˜Q~$ %˜ÂXƒã00P˜P‘ %]Š!¡%(T…‘ µ†™T×”D2s¤Ê&Þ|(†AÄFA*F$ˆhB ãˆ>ð> …;CÁOÿ˜Eþ1 rj)ÌðH‹Ðl&ËÚùŸÖÆ$!Õç5TL£ÆO0U<Å0v¢â™\‘$IùvE6OÔ$#H\!½lJ ĺ]X˜Hê\–‘²§0CÛ¹©€4l¡°1XRP%d„O;£I¶ä‚JLH©¬\i¥€‚J”ˆ³+ª[›°“(b¶´¬«F² e›fj•ší/ƒô¼õ½…h€Ú–4ÈX #þOôÿGü^/×ôOÿ'þ×ý¿óïþŸú¿Ùÿ?ùiÿ¯ýïú²^ƒþOO÷¥/ïË÷¿å”¥/ûßÿe/Ñ/ôÿѪÍ£ÿúª«÷ÿáUWoýÅUYÿSÿEW®¿ýþ:¯:ÿÃUU_êÿ÷ªªþžÕU_Ñøªª¿ú⪫ÿŸý:ª¯ó7UUþ—ïUU©þ5UWú¿ûj¿òWÿŸÿµ\%þ¿å”®—ð{å/÷eý_Í)}rÿ?ŽRº_»ýùK¾_ëþ©KÇ蔬—ú¿ª_òû§ðÿ¹ÿ'æÿEŸÞü¿Ëÿïþú|Ÿ{×ÿ4ý5ÿŸýŸ?õêÿV0ÿ£ÍþñÓþ¯ê·ÿú¿ëýŸþ~ýŸãÿWüþ;?'û>OOùÿ ÿ÷µ#«áøÿ;áþo×ÿ[ÖÉ÷ÿb÷AÁÆü£'ƒƒŒAPJA(U¡T¡T…PJA(U¡T…PJA/êKA(U¡V ‚Pª †Å«RŠ?î$?žýÐùCýßý ©ý¶ª$_ÕˆÐÑŠJ(NOü_ø¥?âý[iÛaÂ1—›}¨†·1F¯ žÿ]€+þÈŠ?üÒÐ$–ÏþµÛÓ#Ràˆì¸#’ õG:Ž°ÄC 0‰R\Ç%yªÊ¦¤4šÃ¦‡’2R"€a (u0p¸ÅþÕŠ °K@ ÑÿÎcª¿ðÎÛ'4mj* jÌåØ)Þÿ«0º¢ÑÖq0“`×J+9Rj ÚsšBCCÿ©º&;?à ­7"ÌŸ…”áŸý?öüë¾`Ù‘üm+¼÷Íéé†&ÉYÆKù,ÍuÈ2ž(×ùGðhzâ*Q§4ŽcÕýüÅöm´àáœ0ãÀéÄ'nGk4¢Æ3RëÜ°½¬ëºŠw8Ðx\†Òc .Ê8ðË”–´Ãúoû ¨¼å7°xø‹·álrãKIÔ<-“*Í:CplI–H+ª¥ÂKÍvµI€L‚`ßsÚ XBÀxÐÏÙÌAØí,¦ gÙÓRkÌO%@m†.FrNnê18*Ë<Ž¡žN8_Fg˜–bNž$øb—%\¢rц¯Ãö†*œ‚ä‹Ÿ4UûBçÍ "!êÕ/Æûú”5㧊›pÎÙÌ¢|Z/HÌÉvBa»&¹'#F7<È'¹á£JÁ Lu9_ÐôÆq²’W0ÞÒ·ÀÊha.]PS© ÔaùäÆéP¦¤ –À r©KK|ä?–âéJ‘‰wf`ÊP½·#79ïýBs¬‹ <,ç=8 …6×Ñ㎆*ìç; ¢›Ç´BšÄÒÉ¥çd¶Í ÞÜ]Ť{j(™¹>Q)é¯áLF‚J°býR´‘b2_b¤'±„ÌÁ)ˆLêÓ9a», 7Ö¯òr'Ê1=ÈôâLyÞ‹‘‹[Šž‡¬’Kf:{¸iôÚ™Š—kvÉ拤˜`N»³7$²SójYÌ„áC®ùÄŠ¡H uÌÈC\ºb‰†h7ªžh}¡˜3ôg $˜K¥ÔÑ©{´ñÀ-ÅåT@EõsæÔ9lq]»Eƒ]3Û ÞŽÌu7ò„ý8,#[3Ó2ì‡×Yñ,:(;¤ÑX”@OŽaDhfwœºÞs‘·—´û?ì³&bÔ÷Ë Ï™¸…Š†c“8‡¸H{v¹m°;¿ 46d| Ó¾”"Bõ9¤*qáž© ò굞cÕ­ÝÒy8òõÑá­Û¼ëœ8õçb6r8ì0ͯ ¥˜™@XsšÞõÐð´Ã ñR´Âž)Ç+¢Àœ4×tQ|¦Ê¡±àÄ €ÊLàÄáð‹LßMQá;õ1rU2^^Î\¶^°ùHlJb™5¥ Í|\l†æ¬%“ܽ’̆gw  Öîï6ãœ^åkQ׉¦v•èŽ¤†FN(]æ0å£}ßiºLØE–XTw\®3Bqê(ÜÛ¼Ìu€ÄIPm… ”·Ì© @ÉœpgÆI<%]Q4Rú­·˜¹ƒz6²W6’ˆÛnWj–4µ’K9ÖÔ“y³e§wÃ+)\nÅe›ÃX¨[­VKvkEŒn.<ãJmtž8ÒsMˆ‘ð6aÆfº2&Û…]ö:ÆñE¶a¶³Ú’Ž¨t‘Ê,¶~Hõòê1´x¨#Òž{ôæf•PDrf÷kx"!$Û Æe²¥ 榾 øꟌ?h8qXª0>Q `©*+¿D ä“Êãc·c±å[^Fg(‹h RÈâ2B x:yõÉÁ0Ì&D.yd³¹€s|zIæ¯TimÑÛÛ*Ì:Ûp\C`':ΰÆÎ%Û¯Rjzý®‡â;c„‘ò<)˯ˆk70°‹2Re¾ …éÁ´.LæcwŸ$9ë^jÁÓA¦ÆÛµÈõžäŽ 0ç™'ÿ=ÍÖ¡ó‘ÿÒ‚ýò‘À™íÖƒ“Cœùf«¬ÍÍhä[èõ©ÂÚED߃‹+„íMdÇÁQŒï%~Ø”‘7Ó¨8"õ¦*,qÚeÅ QŽ9Î-ˆzLú¯ o:0 Èv‘þN:cºµNÌw‡%ø,AÏDÐUäkqÐí…à&¼½µeù½©X~$$‡7Á™Ç–s“Âä'ÜQ0{<3y«|ݹe¯u-õø¤Â›º¤q]3ÓžÆzNŸõ£š¾* [óú¾[æªRŒ! âôQ?ÒC~s,\…g ìr0.)º¸5³ÒÔ"Ô‡ ³„Ü^æ*åTLJ ^$¡ Di… Î 4†ãnAX–=Ÿ àìÛƒÆé"àë¶5ŒÕ+Ö” ! rÆXÂe¥5µ¡ÀœÁeÀáLõtI ìh n—Ð0%&Ô˜1C’–âœÅ(pM“©`˜€BÄrÃf°G¼Ûl*!ÍÜÈå }ü¢'D T Jƒ¨$DJ{O÷lš/Rž°äó™(úu¡ØM˜˜3D<134óÂ…¬¬€äZmxç Gœ#ÿîø{}0wÀ©¥‘…òuŽPîÌáat›]Pa †DqL@“PÖáQÛèS6ÝLrcMfÆŒ]²ãA£$AÆR•Á’¬ÌÜÍV¢ š‘o¤4FØK#ȹ•QQc’Lg°`q™´A!Mb(jÁNÔds9) ±Ê( ر€åf¶“FÑTã× Ÿáÿô×s ‹Ù} ¹Òi•Ϲë_¦ˆóãhñªO;Fà c¶òµo™ôJœHž2†FÐdAŽZx_ÄiÁCµ¹˜aˆ)GÐÁ°Íx<`€èkÈq]‘¼ÃD0faÈPîˆõ `xÿ¶aÙî`dÏŒŒ°M‘7” (kºoƒ€–`ÿÆ}úSTËç»u”P§”*mkÈkéºhÕšçÕ*å0¯:ë8ÒƒA’R~™¯©Ï%õ¾ '-©•jTÕM*&]õï»u×vré•:MÊ¿eñÛñT™}½5„R2™Å®o^Ó%}}.æG•ñ¸‘¸§Y>ÐÛª4Ô¬cDTÑ/âPì÷œGQ>`&±”$õEzÁéäYýÿëÅ£¬@væÈpº'ú:½å«¬GdÓÀžØµ&FäFN€Äó¤Âzçøèæ!¾.0u¥€„°™ƒ!eŠ@ÂàôáH;!t!cØ1G’D Dka’Ïý;ò’ý¼úµßÞH*P =âèNÒG«Ü®ÑîáP;þnμpPI)ð¤ýPDÔÑÉІÊ‡äìЮºa¾ˆX‚h€¦6µàÏÛ8Eªü3s$”ÓRd}MvõqÏöðȃíPsþëˆ+¸@:?) ºB§.f‰°àTyDíyP·dT¸É£»Îh²ß>Póãø@² lxࢆn÷À]C$Ô~êmç€E w_gEˆ€ÿïN÷ª…œ”ɳ3)±Em_¤Õ\Ú[”šPÌÄ„L²rÔ˜0 khÅQµ2­¦ÒÍQ4‚RˆPý(“"H8@%Tb€;P”Æ€ÕN m B—„®i Á=¶æ˼;…yùN Á$„^¸¢TÄ º§±p€Ñ ¬Þ’¥–$\ÚffáœP&JP+.LÌYyƒŠ1R-£xTÍL•p8…) ¸":k‡ÌL»KêÍ*Ò®¹Á¶ÙŽè[®éäY%“0ékÖ=Oa¢ÔÁÏù»¡¥¢‹ÐE]ܵD”úãd aÇ;ý’áŽöbMÖ[l)KKþ>²h¤›°&Þ“ÔJ?Ù i“£1AŽ0+ð@¤¡Æ_·Óxlz<;œ¯¦ªÝëgß›Sl•$Ê6¤ÍFÒK2¨ÚME’Bšš¡¢’žPŽÔ2+ËÀÓOg“ª#cÙ ä ¸g%*€ÿ÷drŽ!Dˆ´˜B ÑÕ§+K–›ö}! Ua íÁÞDõ@3÷ ½í'»½Ærw>@:€<ÀÏl*hDœþFÉÀ(8‚í);iÃ0=¹Z9†h^ò(I)|ÁÿŽíú±½¡Üâ"Í뽧)Ì[b[[YYÆ‚¤là¹g†áÚÜ?Óü·g`U¦²I*ÙؾPé«ÈÔhCûàæs‚¯ST9MiÀ Änò¯.+#XÅ“6V ûZÅ™ý36! ÓšqN,²áKa*%2‹¾gÁ†¡C­#(Ò …:j‰HÎâO¡œ†mÇ yðj[`éüŒ‘2ÎÉ3ß ÀÂ!CDíB8{:‘Š“A7cÃxîÍês­žZo9€^ÀœùÖÙmŽ¦úçfÜn!ÆH„è:C3¦³ ({ûåSC±rïÝ4Ó±bG#F.û&d*æ(.jQÔ†¤mЉ |vØ$’ZwM`âæNY²#)¥žrÃ6\î¯[Oe›µbh83£)’ÊjìÃ`ÍÞÄü=Q"lŽ!÷Ø'ͳŠõ¦×5wUu-R*ÔÊVT„(²„¤"v»$††âçJ`o±Š¼wâPo˜Ñ¡£¼óFÕ&ÂÂ% 9 Ðü;ì Ûتåð1­× õG…| œk;å?@ú[`A å…+sM‰8òØØß:šëP1즤ƒ „ɼ;1ÁÐø±Q=Ç°cƒf1WÁqªižgÝàð‚p¡fÐ!‹GvIx©³Khˆm`ÝÃlYf|tKË'dm› 9K“<¶{`ï³LÚë¡ÌˆØ,åÙ8Œ™L„!ÍÅ°C Ë11–ÚhœŽÁMèÄn¬few|Ì»3Lðùà$Ûoe \@Ì?iFqËmçCqÉEÔÓ@ÙxŠVênêd#ܶɶ ´OT£,kiš,À& 8™ híU-3¸%ɇ¢ò`²é’0áM&ÐÕÇeªÒr;k(©o1z7”<;C–LAÎvh&Å*Í 6]G Ýc0S‚„3à ÃI§¹Ä>«q¹’o¦LÖÙeÃ#3(b&—d™PÙÀ. ädeÎe.cf+Ê€¦SEŒÉ³#k,Æì;™ xš†cžÇlóe¿Y‘Ùµ²øí=Kryf99Ø€W·Tè¡ ˜qŠÎ{8„n‡Ãt„‘s”ènHaûrFwâBPÈG$.Ž…×Qi1i!º“0!<åÚ]5TÅ;I­K‡& …ñX[Kg^s Õ») tÎÅ^£†©d¨`Ü8Ëu)!¡Ç#IÓƒ5†¹C0ÒI2É—©ÜDZÏT¥ò,>ã,ÛçA“‣m\T& P‚CPõ-.k:–a4BgwŠá… v™ &6iéƒMNüm¬N¦ÁŸY\uN©¶¹PxUHò5 Oe„ Ó…- IÑKl´ìîÎêq£^DßlœÉs#‡„ÛbôŒ të>C¹IC*¤X€Þ™ƒ­ÌØ's)µ¢]¸d\ Õ®¦¼-áËúy‡¸C®Ž ˜¾ ³Y á „ئ°»Åc%€÷®`fk)k%Á9e#Qy‚ @°c ¨"É%*H–rÐCH ½df*]ƒ¾Ñ’Ë‘ñ€ºRÖƒ‰²Jjc¼¹"MÕb•¬33a ÉhIšÊ±UUÂI™†„›Íjæf©31 Í33331D¦¡R{U¶g´ÇܦkµCt€„‚CDÞ4‚†(´¬8È¢œYåŽ*m3Zk/(]³”06Þ©RIÒHx~úCXÚ^'@Átp–øKÀ¨Ê›QeÎߌ(MèÌÛ0ÚÕåH®é5Œ›+Bî:‡É ’@ä8m³3Y(c'tl‘Ú¹‚AZêj+PÇ"\ ƒ!j§ (å$C @pX0lÁ6S3—$²Ê Wp§#ÈÀ¤€§-øÄÞ zƒ•ªR»¤x%´‚ðllàllSyC! fœe–,@“îÖQ¦“’Pô±ê"ÉØ9 ¦¦`ZL;BÆLY©³v=ölÐe¶pŒŽ„ØœK‡i–ðEŒT‚pØÒxYÔ躿ÿ$mK4w'|¹C˜PA R"YTRB&Êp˜Gƒ óN‘A(OF¡(r}ñó”÷X|æÆmÙÇILØÔ²jKb€Z6‚‘ˆcbP}À÷»nÂ>irºÉ¨‘æŠí§LTÂ5²µE“j“3V–ÖBDƒJ˜ø÷>öN‰]A±‚h{e¬‰t„ì”2dLаؤ¨4ël,Zcm…ÃQ„ä–Ia´äš#U)©4IõÂje™°ÂL¬åL0¼àÆ3A–HËp-…… !„˜ŒhÌSS"5¥ ¼äo¶A!&âž¼¯§Õ¼óUÖÝÕÀwp€$ªÀ\’:ŽQÉÞ:÷ô²ÂDeÆ)XQ4ƒº5nF‡&qL—zÈbf ¶Î(kšœ M²&"Ñ1{•÷áŠSŠÔL¦S.\¾™‡‰R vJ^´¤567ÉÀ[ƨ#Ã)Ç ›ªMPJl&qR QŘÕI†-„vÜž¢H¦†ç¢NªôÜ…G ÍN&‰MʉR‡Zn“(Ô¡Bž'¡)¢”ˆÑJDh¥"4R‘)H¤FŠR#E)¢”ˆÑJDh¥"4R‘)H¤FŠR#E)¢”ˆÑJDh¥"4R‘)H¤FŠR#E)ù攈ÑJDäæk %"jbbX ägϲ."Ȳ,§o]u!A¥)¡F‘2Q¥r¥W>ªšLƒAJ”P 5£mERÑkcA©-$P€ÔPNDçÄS¾ŠàOx ž‡\Pt½ Ã… h!o±Pi úŒZJVí}ŠÐz{œ8¢(o+Š*Â!©È:)Ö"A»ÉØY€½ìÃèß™öoý÷¨D{ˆƒ‡æ•Èóɵv¨jAkº@q` ÷ß;Vä…!>„y+ ×p „qû d'\ óÊ­“ÒTÇ< ™©0 ø´)™ "¯õ3ÑYÅÌ`z¡‹ªêE*D…Àm!ûöúP^ðÁªr´åÄÖÊ#ÃTWJ?ÔµôÝ2˜lNÂhdÉM,X#3¶1?Bg¶)Àž|þV  ÞΕOœ iVA.Ð ðd¾­øüßõ;]  Å#Æ(ûC˜ŠÁM¼6<¯»T0¨XC ­ˆMj„ÂȨÎ*ºÈsÙ:I@ä‹d FEÙ‡@Úä1lm¨ðHP&"ðlS!ó¿˜Ä„If&(V‡“ç WФL€ÁÁØ=§Ád¢¢×ßöýF~ƒé”šW·0\¾†‡ÿEð㩾 Û3z² f¶:PÆqûÿ‡Ž5­iénž…O»ËÒ“"¥2D¢nÿûÔAø›¥â {C`~…÷¬ƒÛîþïQ”ìÀéô—j"  "W]}-W,Öo.«~²›HÕ5 `|W@j $"$^baC4)L@… èø°`QØB[˜`0tW¼Ü ½¨‡OÿGþü¸BK"h —ò˜aà—àIùßU'¾>?6Þƒ!²qQb„õøP}¹bŽJܲýçX²ɤ¿ALDM–@(¡g˜§ñŽD˜(58”ß ¤vè"hŠ`€ % º“Þ(AÀâk{S€Ð(˜µÑKÉH‚5A±Å¸„Ž Ù `‰ŽŒ9 RF‹ DŒÖ”)ÂÔ&¬vĈk'±üp=xÜ╲ˆä¯ NKI.„GûD©JOŠ¿åäf íÒäü$vƒÀÁРÙ%°…³) {ÂÀ-CSáÒ²°« HJ@<ÀW=be’´Àx©ØümÄÑÝH 7€Å@”¥LÀ:ìÅ°Ó»þ;ÐÞ‚P…¢&VUh¦•J^惾S=æîžoT&bå&J™Q¡pk[»¸fì´¦+A ¡ÄÔœiU)²úUåRMH‰­“[KU¬ƒI¼ Ž•€D!B” 7PÄqLæc€Cžä9ïÇýãµ'OhÅ Í̼Ha.(Nd1B+Œb†çoÇ·mn*0묠èXIƒ…u*ÖàðAÙ›èBÜ°^¢Ãmi÷"h¿)ù¿¤ü§þ> œB–=¥b‹˜‡4Ѡè)´öÉAc˜s­:â4™LT¥¥ b˜Ò'Ô¥¿ø°-#Æ ~rŒ_ðíOÆCövúXüäQPS5•AêK×äS¸b^ÄÈat`‚ypàà„+ý¯®D~<ï©%äô5Úž‰C‚óZE(U"@ì$Cþ8샘„ :‡Ü'”O.æ€0îŒ Ø†½õ–Ü#è…@0B诛³ßú2d¸øÀl.hh.vòë"0ôìS`-öCc~éÿË:699ùÿekYgHΖ14k½ R¾7ÖHCו7ð™|´Q7²ÂÑÖºséW»þü›˜>è!@®¦7SV¹­&µ¤•ó\ª ÐÞ¯¯¢¦Â‡s&(’¼aªìZMfÓ,ÚD¶ÖR(Yÿð÷>3™á'¯¯®V¶þû³Mv: >ûèÄÔYó’!’vÌ!:–`y£Åé/p^NÚkX¬Ž°JšâtÄXU£ì· )„ÑÉš4† ‡5ˆ &å è¬>_½’bàpâR¹ ŠE ¦lŒöi8£|ÛšHS˜¸1²Ƭ,ü‘!E Î†æ íer„¶09¢ä퇸[øØ—!MTÀºK]ÆKܳ3 ZµÅÎ¥Ê68Uçkf¥¶}e‚!®ÁÓ›Ç#]¯*¦cËRB$á*C—…é¢VºK7·*·ˆI¯LÐÞMè¹x(ÒÑJLÁy³ˆò9¥P1Ó°Å‘vD§ªf åï=ðB8ÌèL‡QEFKÅÏ[éWpÒàÉ„3 `¨Ø of¡‡wr`¡¦ƒ&f‚[¦ŒCM&Ò~l¢m1iÝA’¢SË&µ70(qåʘ!Nœ”°ï‹»( BB‚Þ'ËbŸw{.CÕò’œŽÝ/ˆl:þ…€§¿Î5ÿñe;' ÕêaIÈ;ÿbhi (iü¥HÁÿÌD¹é<`€yîª Å*ѳä©!ä¡”ÐPŒ¢@tT9ŸŒr ‡Ç¼ê4‚iÑøEb‰í0¿¥ÍD§ù•È ?HX; Œœ@Øß/ù/ù j©¿T¿ðÿP`ÿoþC9IÄgþOì­×æï¾åê_éüßq¡o÷ú~ùçG…‘nV??úÜùÙ³ Aû‡äˆ ¯!!"ø¤&„©äìù¦œ»,?ƒú¿»[#”¤÷#àX%æø„ÞüSÅE“­Æ°Õÿæ¹ ¿ì1AY&SY4ºa„KÿÅÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþ €Da¬ž(ú*–w¨{hHжª:VZn·¥>|{ÜîXúnY÷Á»ë†JØ QÝÎlxŽžÜr¥pÓW+Õ9à=.6["ê÷@^î =zú2ÛHÎÊÓÈíÊmÎzð([e¯+`67{yözû`Ö¾óîÖ½;g½÷½Ðmf«›®ºÛ}»‡¶Ò.ìÖº…@s`­°ƒ¸­†·YÛÚØêžö€=@§¯]õM'À  nù÷Ÿ}èÛÄå<òXzÐ6ÀøxJ«Ù¨Šˆm• 'ÉzÝzÛ¶;ç×¹€}aCÐÛbúgß`1k®º©}[*%%Aë^ÙM·³hÕzÊ 3Ö.ÆuÃwWa§m$ƒÓ¬‡ZéËÑ×RQE8öÂ芢ªöÊŠ‰Pb©K©ëÛ›ºeÝ»]Ë\­Ü¸îÍY.U.:ÙjÚVYëz7c¶íµ*ëM±¯\Šyâ‡{Ê4h4ÜÝ»{ÛÈJ˜d>Úu4QTR¶ûd'm*wÈ€Š¥£%Hz4=±%R¥@¯YTI ª)^¨Õhè:UÖPè4¢i04 € Õ5EÐ4*”äM˜Š«R ö`yµ §¥Vœö-»s«¶¹ºÞ¥î5¬W¹[¶›Š€ Û^Ù…ç£{1n㌨QNìw§s{¤ô>¾/@*ö¡ZleÚ¬ÜZ¥ƒ г 4Öª.ؾÙq¶² x¥â× ‚44Ó@†„Ñ“L$Ñ„Ê<‘©â4õ¢zCMLMIj ˆ!DòSÚ?LM ©<ˆz‡êêhÐh@ÐÓz•)${U?Éêzš4F&jdÀ&# „Âa0& ž©Jh‚MOMê4ʃ ba1#112114Ðh…"!4h¦&€šhÉ•< ýž)â“Í#Qèɧ¤òa#ÐP*$‚L@ `'¢ž§š§¦”?Ô§š“ôÐ`MB=¤š=Lš42ÿQöúWþïøÁGœŸ·ù‡þHxâ"€ì('ØŠ›Aÿ¸ ìý¿¹]r¤,B©×÷º~ïïfÿzÖ¯êìÐÆ+§øÿ’€„j‘ãÒ—Å'¬S]­0HS`0yô °Ê˜ Š¡   ²DÁÔ¾(Ȉ9ˆ>§6pb`@‚ùʨº•#$Éb*¥fX‘ÄÈ"‚13‡iÁE]#¤C!(Ô!0@„‹HN.8‰˜ª.€RKÉ$“ö@Œ"d…’4‚Ž *`¤©ˆ¨Ð *³Š²EÄŒ•1%˜aF€„P ¡*ëul шHŽÑCXªd ™A, Ú¤¡R#šd‹ºÄwEÑXm¦&-ò~ s¤«úbrþA$ ej6À4ðœ(óù&m©û¸&°/Ç'i¡­…ýòå×&d8 ‰$)ûõªUÒºJÞ^6Ý«½kZÖ¶5UUŽo[Ëm!™UU[èlŽG^ÿ¯8#å ÷”˜åQ^‹¸“¼$rÞ8‡p(úWº(hÈÌÂÌí…[„·md­`aƳL´3 "“mztŠ¢"ˆQ«×Ûù<õtí™Ó-™˜\uýd¤(Zp¡8·uofM±QQ¶Ù"¿]rÈR\åxÛsxÜÄšÚóXm„ÖeXÔV¤ÕKMŠ²Z¥¥­32ÍP±Š4›M¡`›F­c´$Z¨ª-ŒÄ-)@¥#Á(2üúñþj/ü]ýQ¬î“ú¾÷\Ñ\žÚ ØÛ“þþ=ÚF§¿ãþ°ëh÷•ô.]9¤¾)¤]‹Dc ÿU?ïòþŽÎ½Nñ IKü4ÿÓ¾“¼¼NtdžxOá4Ò§¢‘h¥±*f²‘wÞøç\“Ë;¸F•:Àm6‹Ÿ:aþFýX?º;qWMÊoêØê¯÷ñ:ú<…MµÍ FÈT@³LO}z´+¡™Ìž¡ ·};>.Ú—¤fZ,â Ì¥`Ñù-yÍ>/o¥ÉHfQ —§ýÿíš%(å¢2„ðX±àé>?ó”|¾^¿âi ‘úMQHµZÿÜáSÒ‡üìK{7ïbÓü÷‚Gø>ïñ¥ñ‘ mù?13è>³ÆÑ/[“nÇÈjý¬&¿ñþXú?\K?a%½Ï7ïÛ¿–òéïÿG°q BH©”fSí¾9ìÈAé!ã{IØ‘3å—´eð{pVü¿nZú…ºÌlnPÐQ55´`ÈP*/ùczž›‹™ðœ %é÷|Òöt[©!i¢Þ9žSÛ?ú)Þéú|}{m¾ßÇ>Ÿ¹¼ $ÀÑ—wi`¼x¶u$… +)ÊRˆiù!©„é ËØ„]WÉÞv|žÂ¨;€†ãã‹èÿ¦4Õ‚:ùÀ˜µ§ÛºŽÄf*å» H!'>¶('ãU—:Òo%žEu¬˜_AÞ›Áp=ÓÉäo´9WQËJ6ÞÊk_%­äïýݾ¹JRûuKÙ =£‰A2dNIí'àô£üáýl?ÎvÎA6?«û¸/í?ÕûÀ)Oã±ö×økl¿íáÿ_úeûú65éÖ¯ÓþÝVøãü8çNyêÎm9â{¥ÿÄ| Çà€„ø£éÿÑ?'ÉöVÔV1ðßëûÆP¢?ňØDð~/«ö‚þ#í#+—âÍl)c]l?øߧUþIGNµ|®]TTàÉt~­8 7 Š5 b›ï+ O÷)£»ë;í4kR µµ1÷é@Ú JЈró;(ZÙ!µ£(îGó#ìEÒXE¢8#¢(‹¡Ìà–Šø¡ž3õ9VöÍka~Ëô·ï—è‡ñü­Êmü^°ÿñô’JGíýÔ R„¤ ƒc`ØØ6;?›ïýy‡<ëö ÿ/¹ëðþßöÿ“^ÿî?À7†Ûo³§þ÷җNïOm)øàæßåÏâzkéþÌ~nï¿ã?éoÅâ÷í)m]½?ãÿ¥4Ggø¿Ó"w6Ú'O£É®¾¿ðνR^¥å©Äø;#Ñ<Ãñ™ýuúo­q5G{CÙMõapöþ¥úü9EÜø€fËÏ?_»FÜ:ú±ý>‰oËE.÷ÎܼÞEÉÜuÈâžx«}}xiñsííÇ8ñ÷ávv#À {ý:g_£>è,azƒÖëj­`:[ðªóS†Õ”moÕ-ÉtÜxÈ × ÿ€ï=Â<§³‘ÇÛÎ6—?]½¾>ªá9*KËéá/žÚFgË»÷ï9Z%^þÏDÍ-Ãkõ`ñ#‡›¿§'-ú¼ùàs|¼_/âþvÈæ±ý¿£Z/@‡ùQÁÂgækŠÂ_Ãæå6±1Œç<§baü'ÄÿJšUáŒ2È0þ˜Œ~é‘áåù¾÷£Êyý>¥ô!í^ÿ§îâ}v„rø~#’ärx/™tètèÚGP˜ÿWäçÏn[ïHŸ—½Õu¼µ×ׯ:ÍXñë¿ÞhxMRv§#Jk‡Ùõ†³W­!´6ŸñGóü‡ÃþPà$¡Ÿ±UZP^ŸõÿG×bi&¿·2; ¢~(Áçÿ=&ž'3 éÿ³ù¸ÓzÒ³V1$Ë1‘"<±ý?󞕼A ¡$ ƒ?3“XÙGÙ÷XøíCü®Ëïâ„sõÿŸü=l‹Ü–=3L>&°4kø,²Œ8lº†w¿æádIŒÀ~™$Cû?l.Ħצµ£¶'ñ[óĸÅ=Ùš”Ü6àÄP»»¦¸q¨…ÓšP3m×L9k[9!S,€ÃËÃ7}üã¨`&+ ~˜â2c­š0À ,DXÌNº5½i…•t8D$ÁTc8A¸ e1!̳Â4°o$5ˆcB“Ÿ”¤øñGg•›h»JMæh1jy:¸VãÛ[ZÖ©cˆ µ P ¤éÕ^þ?¦jf}³QÊåÅ8´åI(1é‚ÏõwÉú難†Å›Ìs&¤J’P¼'5©ÍXy¼ÿ³Z¶(YX¹ð­'Å•e¶ôµž])&ú YÊ@ðYl¯³Âò~fÙ}8µ7Ø)%ýiðx’íÈ!)õéYýݽ$Dáe¶Blç®ÝSïš‚a3Ю/­¹‚i8ÁÊj™!mÀ•y‚Ôÿ>†(ƒ|(á=4²¦Ê–Îaseèˆä¢$pƒ©q) (rLæN¤Á²r+ˬU²R<§mêéD‚[É!õ˜NªH¹3[¯þŸö¿øV=‚4ßwÉ%WpÀàxËÇöª¢½A7 *úÚø.9Àµ+]3{#FÏá?¶æìظOŒ5*xTšå ã+[rÌ<<“4Ä6Qç¶]YP:\™ OÎp?8àšÕ¬ºuzÕyB:¡ºùéÔ™ôH“ámœ•ïOžh¸*]`Í2±/WÀb³Û@Æ•åéÿëUþÐTiø=;ž¦þ”›~?÷sT¥)J/áñ½ï{Ú’I’H¤’E$’.qÅ«»^ñ"9P›Ëî 3¼Ÿ\ƒÃÇ¡>”4:ý Áèt¾‚=æ{ÂsƒVßÇТ£rÌá&1. @=³?ú•@ûQD|ÏèùŸÎëG?ÇS$Úâ¼—_Ã(r¾$I­Y @söþÿàwÜrò=³37_ªN8,­éÑ\sÌã_»ƒœ§˜WüAÿ {Ÿ»møØRgû :Zð‚P94$‚}oû†YùûÏü…æF)ûCë”BæC)!’ …$ÝOο,i?d$~ÈÒ~hý‘ˆvŠK”ÌŸy¦Ç¼NäøGÝòÕ}YYUWïf¾¯£÷ÿ5­kZÖµªíµ­kZÖµ­kZÖµ­kZÖµ­kZÖµ­o~îîî㻎v·ø@r$$#ÇwB\I!#çY¬¬¬I’MP“&1d­%& ,ЈÅLÛ0¬›#Z5¦&…5$Ri*£PQµ¿P"ÙCxì;ffc™™˜@AM·ï—m6û.èÈIJ¤¨†d€ÒBJ}g“_õ}w˜~SiΚ™Êò¬;ÇÌ´ûmm´–‘M’¥6Ò–-EI5I©¬ØÊÚl·×>d²Ï_³ 6ÃM°Ól4Û 6ÃM°Ól4Û 6ÃO_ÌzyXz€ŸðY$VjTª)F’3Z-´Ù%SffÊÊ” ¦¥¤iK~nk+­4´Éf›iªVÕATi!‘~>¸=Pr?ã]xC<ÑÔüÇ›¿Çá)JR”¥)JRm¶ÛmÀô ÿ ¿?õÎþß–%ý‹³Ôª¿çf͘ˆ‘Ú*)qTA?W³:ʉ7[÷Ùb*Q"HOõP2ÈöÌþ*ƒ­]üg„e¸ð¦UùdD¨¯FT†Ý¯ˆ¨4$^uª^œ~}f%¤§¥Dx„SPdÎH‚ÕdpWñþ¿êó‹§ \ýLB ùb8äšüQúá$jOh‘è_v?eнKÖ¾‚BIþ/÷xy`ˆñzà¼FïýÝGˆ@ ³Œ„LÅ’Ëi ˜Š‰$GþÈHGhvwu¸æ¿êö‰$Ð!q1Æ<ç©AVuJÒ~½ÿAáÍ, Ö/H¤„’=B=DWY#'ô9úÏYë;û¼çRòžä—òðÜýÿ¿v¼Àdub£ó*žÎá‰{Ha¯¿ô(Q žÆýç§ÓÕ¸oˆãƒÅãìê‚Fý´Œ„V¾ÅQ>ÂCÌ=L€}ϨPAµ§Å÷LJÒ ÞÈjA==¹_ߪ>¾ÉK°?OúB¬U;W»°åÙ¨2ÙBªäL“‚EÈ €Z•ˆC_ÿC‡ÄzÞî€ý#áâiêÜüÒDžhIíc$ 0#ô<ÔTø8ÐC5KÑæû·A--Dz<›”pI~® Ð0â,¬Û<Ÿ°ä–Ç-ÎE×v‰sö½8¿úV!qÐG_‹~-ùâÉrBâGWá ÷qø¾¿šsœç9ÓèrëŸñ_ôâµ­kZåv‡¹ˆì`xø¨ÄÄwîðì9råË—._Å×úqŒcÆ1Œc¨ú»Ä{_Éßå|¼×==(såÆUµx îšíÝÓ¦ý¼;xöòíàu‡Cë~)í s’;ëH„~9ú¾O»¹ÕØï#(ð0ñ<ö &ˆP‰Z¡b“èú¼ÓîüþvÔKüó>-`œÚ¨_Q|‰-²óùüþ?ŸÏçðP;H?4”¯ã‘ô¯Éé¾kèϯ}Ÿ`?{\í|¯"ñ'¢U˜\ØB³@Tñü'ÕƒêõhhMO?‡†ç¼l¸SéÖà ´²JɈM ÂáT¦wÐ@ï+Ú«\ñµ­ç·:Z«ôwrVZÖ« L”AualwU¥ŸWê×¹±ˆ@k(Ö/Ý~âÑ´šÄœ´ãPjQJ”PJ©†aXd¤ûà`~<;DªqŠ`ĨC)ï§çÐ?kÞžÓàû»Íkè´3Ú|§À²PøL£Šó®>/Ž^Vˆ™7ĥ#W¯¯ØŽÁŒ`ÜP"½å\!yù‚F‘Eh‰Vb`[&Ň  2P"%¬U~îã÷/ãø×ã^‡Sô€Ü’š”¿eTœšhƒøþSLSOš¸‡eÒô^nƒWr–3iضƒLÓD“œÒË,Š—úy_;Zo*‰+{ÞÛ~ßý@õzÄÒRRËMúN@莸ÆS4˜Ù ;Eøaîã¨~GlPÄŸN)¥†DJ ”ˆCÒ †`/ìÄ0_äÿÎß4Ä~^ø>! CÎ@zËú|÷]•H>Yï øXø˜ù™}~¼ø€Dµˆ-*´H·ñÎ!"A)~Ï¿‡ð¿‹ñZãéÌ–P~’“–¥:R·.R`ŠÏü?fÁ„¾^ü¹|WÁkZÖµ­î>óɧ¡¡ü­¶Û€ø„/¡¿EvÍ%%i¤T¥T´ÔFjFdÔ¬TLˆˆˆˆšömubÄ×4ꮿu´è›ñis 0$¤E˜Q†l0q PU°÷¬„Jz,€f½.,Êi4­š¿U^þjº AjL¤ÊÑ&Õ4¬Öm&Úh[Bd2²Õ%&²mJlÃl”™©&¨–{0íƒD2p d€Ky@~wíä?/»Qé†UIï“ò~¤!"!!")@{âÅøaCRñL­) …@J‘(jƒ4a½!ªG•@ýü’9~?ïÓôò¿ø¨‰óv0~0DCîJ®ÏŠi¨  2­2+¦¾ÐaOΚ y€ ÆGÆ…Õã;ü‚,4òj¼ñˆ)û ’Ý?1Óõ§Î/ý>ÿ~ÕÛU(Ó+ð œyÁM\B$$c“sÛ3RS'¬äuü‚7 ‘ƒùF͉¤aµ,ØUFÄÛk †[ÔãÇxë@Š{6Âl–Ô&/£é]TªúcAù¹’^`Kœï·ñêt뤮©Ä¯_ Œ*°Cð*¢þÉCÜ;îæ‚àSAL¨ Â|`æX)C&ªÄ E–90«’d9&Jˆ­ÑAHf` dfmE· K$²Z­\­aŠ.f#MD™˜ S’Jªa"‰„6bŠäˆá=ò °±#µB¢ÒI¥jJ€P¢c(9)@´ªhÂ2‰Q!¡ëïíýœ—ù|ÿ)ûÿ»ÁÑ{ŽuM8ÍûzÇBA™‹ÉþÕGþG•>¡Ÿßç˜ÔÁjþ *Û±öŽxJR/rÁ@/XË1ac`±]‘˜W£³2Êó<ãú%]uŸ=oµ­:tI­f©øâíS-»²M?¹,¦#44»lnœÜŠU™¡¾åe¥½M¥(§dœfXgöDC‡8páÇo Oÿ£nlôz नd°·Á˜]×Õô~ÏÙÇ[ß÷¾Ýç‹úµúw£·°´íjãg»1š_ƒÚ¡ÃM¸S<4‹ÊÖÒZ”³61œäEvÚ8páǯÝñqü>iÎsœç9ÏÙí !¨UI$YETHª*¡TUQEH*‹QB¦¥J•5jÌÔÊ™©5lͶԚµ2¤ÕF¢******5’¤©*KIm’ÒZKIi-%¤´–’¶*¶J’¤©*MI©5IRjKZ´Ud¤©*J“D@DÐ’tÕø14BB*Jª·²´[ˆˆÕÚVÛ5|}ôüçîyjüêÆÇú´r‘~Öbfý(¢BªsâÈŒ7ëŠV0Žáíô˜GPv u Uø*þÛm´zºúkf¿‰•ÛÑ\èvKâô/u—º­·™š°=ÔhéXld6Û·jŸ ¥’jô ăcîô~p¾¿¯óɳ³º>öt´.ê ,Ö¨Ôi?£ ‰¢»¹³4iñÏ*és™•÷<ªªªª«ƒ}8~>fõே®îž«ëû*öÿK-5¬£$”â bœæÜ]¶–"" ˜æ:@|=RZ.¹Î¹×‡à½vUUYeUiÐ }aüó‡µÏoëúL"' ŠSòÑ?ßõWéô6øªœüÁ?«ixų÷2>x2ƒÚtz S˜8ÕH„…Gè#ƒ •"îó [O„ÎÜ9¯Ë86ùåVí ÊÂ\þd§ÊGàÑë>èø˜†ëö'²¯ó÷ïÿ@Ü-´.@$‘i1Q ´…¤—0 !Yð°Ðþ8ëÛö¿3‡‡ìY_\ùŽÃ»4Té[$k÷?f!Æ2wº…$?ê 'GE¤ÿPÐ1-g×b÷v$‰ÂNSñü¶·Îš^x &½¯É¯¤ïAxð=Q;—¹ôWØpåüµ¨ÐG´àLSý 4¿è˜ÓjÏÛs‡ú mÅP>¨+Å.)9Aƺϡnšw–‚›`¦äÚt47Fè”,ßS€,Ž[*ã$*û„q D%W^1G€K«„M"k3 ¢iFã4—+oúyË¡'a/—dxwÄaQ{Îâ#ô€UáËÕÞ¨kí ýÝác«³ §1@F'׎ˆ\'ÂÃcPL¤1×SR@’’’… ¹:ã5ÞðŒ8œr’èàäõíÙ%²Kv_]G@G@1ô>9ê¶Ûò[¤’D!f½\7ÆiÐçÀ0Q,ñI%Ì„ƒ hbÜuÛ¾9!$ l×{ß”¢`.°M‚Ñâ ô¹v• øÊ  †[\WW @3†š7èj 58+NóC KJ Ó¨ä’u®Ç@àlã2’É%4‰¤C&—&¸žFëÓ8Ì @E#6€ÿ, 7Z°1~¶£Š´°ÊNcr…M¥ÑúLyÒRRReÎs Òò~ªf«&AX7Ä,ƒL+/ݦئ8d‹è<õk{*.nҨИ’”ÆÉÐç[—$†c3cb–}®Í¨Ô³›&ØÔ”¬Š²l§;,i¥€ )©(ôˆ)Éûh‰êüx ™‹™Œ*tå’Ù,²wAÝÐIÝÂtD }¼µ]®lRJuåi—Çñü¿‡áûoü_¿9ÎsœçîÑ}¼½Ý¾ªuʱ*ð;¥ùÇ>|ùóçθÆ%ŒcÅ1ŒbxÆ1‰ãÆ)ŒôoH†Û{6á· ¸m¶Ð^íÞS‘N%&Oçù‰;Ѩgkã œ6™ãˆ§_èûèxŠ®ÒVîû¼t”šÏˆÇC"—ç$A¡)eÄŠ'Íö€Æ©ö…,Ÿ?°gƒSã(2•Ÿo¤ùU’óÝYn™ W[€¼À³{D—MÌ-A`·ãì”4!"§ðñÚ¢)YZ<þƒòýeÃÔ£œ·¿j!m™SŽµôÑ”h+RB@:yÐUÔ¹ {'@c—SŽÁQ1L}aàaßžøˆïôÐ_(¼& °¾\üNç‡ÉÙ4|í Ööä×ÚüCäûwãü^< ´6‘Æ—´7Ú×s†Cn¸M|p?#ë~o›Þç;­¨­+NÖ¨Z-Ÿt…¤¢/{ÿ»‰©<;Ò‘äа¼oMôè+&ýŽU¶£ÑNÝdž~4Þ…Ó”¼$H[VD\ª‹{\-Ì~O7ù?šQ¡uÐ=}¦žI/"îSòO³Ùæ¿…ü™ˆÞ@VWò’ýÁ°}!á"}SI‰úaþoÉ5'óa|ˆ±zÁz;ô>À_)œº0~þâGga€ŽS#蕬|á@Ûܸ|-Ì—Å"aºõ3ëlvri´—Q)“ù9ÿ7aåóR"â""""9¼|´¤ÔÀAügä6z¾ïÍ·«ÃÕõŽ;Ú¼~õTEUQ66ÿw¶vòøÿ–Eéå>Õ0æzbÉîÁiYH>iÀn]‹ ,²Ë/Ïëø»»pòüi€c?I¦ƒk¿íCîǃoÇ“nÒéµúµ‚&&/`&x»”ã&²%™Ä‰Á>(‘ÀmB&cKæö{cÃÌ¥4FœG8/gnnÞAËaôºmÖ‹Ëm¼°v=%FCåa@ §©Ý8p+D%f“wˆ³í ¤ˆûH>¾^ÓŸv»k2dÉR~>=ýy}̆C ¶2Œ¡Ðœ©2Rª)£›lFb¬ÊªU ˆ’U4ªÊ†XLº¦ÊÞµ%SWw|ãyV¯õŸÐ Ü «ÈÜ&ÂO¼mÖËš"""3šöíÝø]JøÞ÷ôíêñßCv^·©Vöõ[Û(Ù®„!®‰\ù$cÇâ/¿ééÇ×$£Ü\Îý݇F<ÃáË2+¤´1?¤¾æ¸‚utóçÅ\¤£½{… °¢ö‡êòh3åÓUâQ Gœª~&WH¯£ñöfyˆ‹(~&@õË¿”¤À ÊÎÆe˜ˆØdãÏNèèï(ª¡J<ȤúŸG=ÞÖ¹èHë0.·Ò9#¹„ú<ßm½ 8œðñ'R}Éù“Ðh îÅôoëmø÷ÞIòØd2» âµRAú’\œWâІ…)³7wZöîã¡6—u¼­¤ŒýÊN`&"ÞpÙ%Jü¿?Ÿº¿?°ý¿gÀp÷«¯Ûǽ<£2ñ7˜b¯ ¿?¹÷ugb—Íø/ŠõÊÊÆì­;iÖec± ¶Ýº¯>Ÿ¿Ï³õëe]÷×n›·Zëm´–ãY³^í°øvõô²ßUöGÍÒ|`àUx¨!{o¬²=‡IlIB„~U¥b"" JRúNGé0L]` ûÁX?>P´DûÞÑø³ÕEZéçfâbªª„! ©©® (Rj±Á%NÚ ¹÷zý•éìmµÇâú¿ÍÝ̧¤AºkÛ5Œc3$ÌËs0ÑzÎ¥ýÖüg£Ú‘Î91™™¾xéùÿC€ à ‚°_Që%ß×öx¾!½â8ûÖO–”¤7 ÍÔùÁ%` êDDDD{}š§ŠŸH Gñ~Åæ‹ù;YZ±Ãuv?¢GŒ(„8÷„! Ø!Ú^)1éׯIŸ`/”~?o¼‹‚ÃÆ””Æß—ÜL—Š#Ïix(Z.…ð‚úÂy&‰‰ñ&‰ûÄÜš'šJŸ¼œ§Ø)‰‚˜.¥ªzÔŽ±8è}GÜ-ÀCËuÝíäi_”ŒÁð}®ÞÍÓ:}®?°ð<<<2ç× ;åøÆDˆ‹•9ž`XàØõgü^r]%Ò]Žç;¿pOÛjÔÉ jÕ«V­©G_{¶ÊU=\e¥]ÚÜê­¯ …Š,‹¬E*¢íÝà¯õø~·ÝÝÝÄD|j˼P]€»Á0^”à ó«×FTöõ¶Û~›ã¿%³Ò=Oî‰4‹© ˜L&ÛÍ0ýb¬Wºý¡NÂEk8ƒ¾„wX•›§~x{»ÝÛ‹[ó­kê5$“€5­hÖ´¨ªªªùâÃÃ^ †+À•œ„¾?¼„¬‰ŸAq&ERŸ¹³z|îý)Ü¿±éã~"%åÌÄÒ;šÒÂ@…~°I’”“}9p(ˆaôH°­{Ÿ þ†Çrµ¯¥DÊR‘iÛ`;ɶgª'iÖuÇ<\ÆoYëÁ30œç'LÕV§¾Q(ˆ¼°…·)eFqŠBäþµ(Z:]Öiã/!{“rGBáXÑ X€°_¶Þóyw¯Ó­åo*»€Þ±FWOyÒ»®¸U˜,^…I~÷`{Š(ê½XDrO‡Ž²mcAãÐʬںÖÆ…~ϧ²>®þAøœ;‘RA ä«JoBA{À$¿*)U—/7YÌTP·º>ïŸÔOçËÕ*õñãm»,±ÊRˆ„DCqD4°ÒÓ¥äUïãø;w%)DD·ÁØü’ú>ÆÇ·ˆ[ ’ñ êŸTAP¬ÀôGƒWô·â’_æ|Q&’Ñ”ƒÓ"¬õ3Gë˜=1÷OÏ鮄öRWpêаÁ 2Ðû~ XB[£<^»AßÄ‚Z’«šúË*«(<_"„F­Ž“‹áÓ‚«ÛÚ@ò"g°_·¥ò»¾<Ûcnß¿Ìb¸¼ùüÕÕ’üÝt‚~o¨wšïtWÝ<æ‚‚’š(héÏ›cczÓ _'DzŠ¿wØY2Ìf JD¡UV[ ïFd&ÂÎj òž¬˜¸ß=\–9wwå+äÊ/,mŸBç3 [óáŸÂ ùxx Á@//Òü*| .Ð^s¯€·èqfܬmÝÛD1þ˶ª…ZV—ÏB»ºØk4]ÆzË>ÈíÄ+“ ËÕ{4P%8›~bLnD¨ ¶DŨUí fÌè!`´È&jÑš@^—=\[L¹¤0ÜfH $³äÛk|f ,ˆ‰qa¬,ÈUtf«aJ·jÈB6ÉŠ•j}ø¼Á  b qe†$ ™‚"i&“®`qΓH%ê¦ÇÐloO//F ¹…±¿”óX’}ᱶI3žŽ I6Æ} ÌÌ?Œãõø‚(g”â4ß̉`:‰ŽŠž4×as2<Ò‘¼³Üˆ;MÈ8>~¤9·ÑÈ°!/8 Ò @ÊÖâ ¾tÿ.ÌݤÙÖ.rçñÖu}÷sP`ÀX`å%û_µÇbR”¥)r €ÃÜID°<‹Î&&.Å#¹­Rî3ÉÒ’Hµ ŸUFXƒ§µåì¾µi{)Ši:§?Aµ Жužçºø‚eþ ì†_ti9Ø­¯E4•(÷ƨBÝ0Hä÷$ïd[wt:ûû¶ed°"æd© t^ÿÃߜƺ›½;ïÝÆm®¼ìYm‰ÝRUj£î ‹*o7Š˜Ä¥1`DæOKãdÚ°†,›hBe°KCMg‘ .¾1¢/¬¹3ÙU,æø”JádÂêTa^ô†ŠÂ1Jâ‡w‘šÒš–¤å€C’Ýmu›»lÜjïVÆÖܵâvu)T]-Sè"^VîïÏçPÒ]q®‘‰: ¶IÃÆÝ%èz˜‰0MWUÚ'_OBR.k]DÁ­qrh¤NDFOµfjŠ¥j©_¸oXZôŽõ|Ÿ¤œþx³p³\ Š“Æ/PãnË¢〣jÆò’.Amžz$Uçæ(I›zÍ  m‹¹D#†_wŠW–ÌÌð×ÓÙy¡ü||³(ª>|AébŠÊXzÔÿ#U!^¸¸ø(Ëôi‚¬Õò–%@„ªÖ÷ìç}ù8ã8_Q‹4»WÄ7Œè¬@²¬ñ;WùE©´$pm—dضèÄaò³ÇèÖ·ƒÚ("9µ='$âôY–G}½ò®Ø7ͶtY«IYx"MqN{vœÃ;x;Œõm@Óp„kÇJµ3š#4˜$XÕWœºÆX¨Æo +åYÌÞ-o+ße…ñk/å#±IÊpFÜdï€Ïqõ~­ê|~ôáe/¶Ùcæ=Ǻ¿m‡ÎÉÑsôn_¬—Rá%÷ ÑI«4g„ŽJ%O1♹3ůߥeƒ å¦ZØ— ½‹oÏë>#zkðÂëÒ˜wCÜ!+DJ›)ÊÅ ú•þ åuÅ—âõĵ‹CÐGŽãzL¿<ê- èŸ"|*H’4ª›“͘¤K¤Õ-®}Ÿ S7RÃ$ûÉk¤í|[}óLh¼S'ɽ­€ Îd”b â©3!-'Ï*å‰w¤t`æH>nÇ~q"_£:ƒ"/w1âëüÒà ”­™š°©/þ¸Ó´!“áÛÖñó­}ÁL8݆RüÍ{¥ûö“³a³dkwQ~,®³öÈÜ”–¬1ª1˜ ¥ÝÇDL–¡ ‹¯J× ¯ñ¢ƒ¸.5áç`„´Š©õ†|·ª«XTd¥‡±)È"3Sîà°·É*éÊ| Jz×L\¯J7–e¥:¥Ef2)æò«FõŠQAZ(²ï€0X´ªÆF^màÖ ª²åW; A4 kÀ!')‰B3FºÜþÏœ®”ÄÕUQóÌ)EB¥DR‡¯Ë`³:k`HSëäq[>߀¾ÿ(®Ú_ÐI(©-Z×_ˆê:T0D©zjØSôØSjÓ[]ûØ™ä½ ãnøøå[ø”pk›BØ(.Ï-ƒÇPÙ…Åx@Q;6Me¤/¡¤a{3«½ü§O7½Z¤p×P×ÑÈW¥:˜¿„<‰ìÛm£¶ÉQ™8B»1HþNº!Ž< Õç·>:Årú H]¡ß‡/\ÓÏxϱbGë¾£ŽšŽjI­ ³PUI’RaòÚ/ÂÏ3ÕÍÎdëMk§Ý„(Ô÷ç†É à×ÕyŸxóš3~òé™çÄd|ØN€$È|2àAçŠBîóät»Á€À§oð³(óã@}ô®’U6Ôñf¤‘MY9µ¾ÆŒÃE¥[KiÇH ªÚ!f¨‰xþ‚@¥DÃÄÅ¿9#ZÅpfÐETÊLcn[L>QŒð<¿\Éè²Ô¥,_Ü<³B—fÉE'Õ¹Q|Ó_+S—/$d\#²É]J)x“‚k¸ãLP)øKåÍüGˆ­kZÔ©¡ËNR¶©¢m2Å«Ôè ½ðKºd„¸>4{¾’¬-›mÀ¶“. i|¡ÀŠs…–ŽGw"BîM‰Ü°÷Ô FY´fJI…ˆzzBë‚S¢o­ä¤ÖɱÌ,ÊŸ [@¸oõÛÌÊàÖ#e.ƒ]úxˆ7ÀuÛQØz™òÚ[Éä}Ñ?6ˆÊ€ñãZÌpãfŒñ1ÙÉLÕU ½LÄ‚ežæYU6ÓÖ^ðµeßÁ߸ï!p‰_AqtChb˜!.TM3n—‘V©Î2ý!­³§1¤dèrëR@>EUÝÒkNÇÎäåæ)1 ñ2lM‚ÕÖ.©ú0âÜIÏ9¯^æ²±„ÎçÚ¶§Tà ðg³ÇY…fÝgGE(ðÊéÊR_ré‹ç¯å¯ÝQ¹gõŽªéwGyÒ›Ø]Sy¿.a빕 ëž!ñüúüø|õFffzÉ3Ó355µóª(ªªª¢“ÞöÓm¦Û! )}y¯ß“žwêýÝ}ªõçÇ°UUUUVÌ_# ü'_‹}}&1}p}«¨4ŠH[½> ¤”¶%$£Ž+uI‡\½/Ê \*ØžQ)1Œò0”»õ™Å*Ù¨:N`6?\o…d!Kì§ZJ)µVúŠT&”ªÈ‘­š=Iôx}Ÿ5dØ[žbðôá‚Šóå(E¸ÂR“"|`5Ç;“mã™8 iÒll¦ÑÐò¡6“n6$ °Ã‚æl•Ø.ËßåÙnš/!uxZë*´p>+ÁÅ"`ºô ÓÜè°5= {꣤X*[·uULí|Ë@„¾,×Y©Ó¥Ê„«Êhš!ƒç6ÆÛ0èã ±4±¢©ýPJ:¤æOÜþæy4\‘‡ŸCŠ¨¼1Á†‘ër<Ï5¯gäë†g«\ô9p9V³RhmM„¤O'I“'m›m¶ùÐØÃÔ±b«`x¥Žï>ªÍ³ÊîÛ_Iï¯ÕWOK<Ç—DŠ)¦Æû‡Ï¿‘ä#«&WzBîòVd"Ý<ÒI#PB¾¾Dm?6`ŠB+,ÌWؼ§CŽÎëa^ÌyÒ=0«¹ù4<Ò¶ª÷p5Zk-œusC¥p)À$#„½KÆ@cµ='â?Œˆ¹ŠÂȬ,ŠÂÊ:r:r:r:r:r:rX~†¬ÝïÃèŠ*ª@?ˆÌýõFhÏ*ø¤¢!¡J¬_ãÒ´ÃÆ/YÉá“Õ¶î+»Ú²‹ýúÏÙ£—’y¸KçÅo7µ¹nÉm«/¦pQU—ק•‡Ã-u×]_DRéÉxE.œ—„RÝ3_¯‚Ѿp(+îù¢Ÿ‘“@"¡}cAëj½É}ÑáðQW›óþ}>¶:Š–¤+âô¹˜Ô—ºÁ¯û­WÅ·'\=¥oðkL{ø¾ênÏÙ$Žç’gÄv4]†È*_Ø´:zD|ðÊ@-ößÛG® Xû>†^¢]×SØàq‚sünʪ¥)_Vî÷‹ý79éWZ}äôB‚‘%Œƒ‘ö¢p†÷šóÌ ƒq‡G»M펉IBÄÑ™šgŸWÌß3ÄV+e^µ—äVsßúìØ=xÏ O¶¡öcZ·{p!-°w‚8;Á ¨R0.Gnºïù}ÌEEa1Q*°yâp†æ3йöÈ”°JaEØJòP)—âaÚ ˜ë=v£Dï1ã}´uƒ°(»Ú(õ©BX„¤"óÄ^óI5ÊäÛlx+ Í3‚;Ì;k‘•zË£ƒöå>ximåPB]/­WW}_q9p+vÐF0q຀)j†+.¢eù‹ÆóêM<óÔç?ÅÛá9Hc’I$“$’I$•¶ÛçÒoØî˜D™±Ö‘'Ç–Ñm¥òÛþv>h{»VäÙ9þèž W¶Š-iŠ] ÙsÒ¤ Ç ·é&öE•†.ñEùÒŠ>:RÃÙ‰òÕL\iÈšÏv5¬…ÌÜâÎΈÞ[|{lLè|rKPê¡Ïà%.È6ê"<˜ŒÌ[T#‚ö;××®i¦¬àÐó°Å»cÓßœæEñ“¹ùMãÝõ]ã{2SêÑ Žì—Õ­„U˜öGß¼¦Kç«#‘Mܵ‘Qn&²ÉDWrŘ@ØÊuט!.3&)§ÒË3zLÒD“Çs Š›ci>.)ef޳ײ'Æö°½u2"Ö}­I‚õû€EÏ=ÃàÛ¿DªK·ªÁ¶¡f¤&£­ÇÞi(g\}¹úð{ôVu­dd,:åÕ–¨P”(æH7b…aÏPP˜]Hú(ƒ‚¯Àis)‰þU(ƒÈ¬•#-Ø%9NÞz“Ló+Ô¨.Ïœ· Ó@ô3 qsò3×/:ª°õô£ÇtuÎ;Ë¡Yù#¬ù®²è²c¬´Êv8Ïje4Êð°ý˵F†¹—Ó9“ÖGYùó3ÀgX!p³|^®;u“]o˪¡ï’R3Ò„”ê¤Z+Š ªšôû z_S3O?Ë/G»ßÈm¦N³S]Åo'å½ اi¦¼åGzà[¨€¡.ºÞ#¯é&të¦};ðàÜ÷&¸GqÄŽ§âókÏ=‡L#‡8C(V#·„Tƒ؆Ž):U¥ÀŽè´ôuøs'–åVŽ‘Öj䌣±!”=}]TEjI„wkŠj:¯r‚_›?}ª—Ì2Âp+Iëç8"¸ÑF0‰|ÖÀ^dà#Žš)%°¯ñLëëºTH!©¢ã§Z2uø¤iz ñó’VŒIDù$¶^;ã`„ÄpbìºsRÁÆ”Xµ%B4¸`ÌدU{äh¾Pr [_ [õo‰wü@¦’6½:ì,¡MŽîê#®þ‹$pÖÓ<Ï6뀾U·N¥ñü »NÛzíp꟎;X^‰ø¯¡b€.ÅU›.ªÀyé[Ž1lB„¯5è¦djÅ8´Ÿå”’›.¹-‰®k§Æ¾ß’nx>MX—\?àõÉT…§‚¾^›\”B©æQ…2‹ÀÊ”Š3–bÙ”öÒ>1£¢BËBž–±¤ÌVQÀìRš¡“ ÓØT ËÛ Á¼WrK]SkŽi„- ·~à¨8Ó!¦žÍþ¹Ül7ZÖ¶ç°VµˆŒZ–­k«Æccó‚•õ€èð .±qJA[  žã¬P \õ"´è$ÊÝ-*ûkš0Ì…dý³>_Ž5(ØÓÆ1¼x“íP»A}~=¡Ô´^>˜ª7ªÉ ðŸÏÔû)^õf¤ŽúÕùTkçkmñ¿y~¯‚ ˆƒm±¶4Ûw°×W¢+Æx+âdy$isÊž©ÖrÓ{óÙ2Kó¿Â³¤½^ÎíåøçbÁ-oht² qÎi^ª=µƒ + PTÁªÐö¦Óe‰ÛÏCß,º£k”êïÖø*d[2u½A•5;‰P‚ðLíÅë8°)Gî u,ž/&¤ô%G]9Ї?( ©í4-×C˜#˜"fÌ)žª•'3`ƒ”ÌŠTÒ„&†yš cß–òòkP©‚’)9Lž¼ûMã’sæå<Ý@½røeÍ^˜÷o@V/âôĸ g’!ýÜó®Ô0BÙÊI{çÓ¨ñu¾]µÀºÔ|±Ñû )9î“jI†‡ Йh”—œP Î&aúÏÏ\µôéP]'<|4 ëdÜæ­[Í×\w;uù‘Áäm`„ýÇI"/™¬~OÑ—6{¹GoøvtÀ¡fia ³Mö&ä…j¢eáϸrã¦.O7®ÞðoP e &T­bž©Hêz°ÚQî‚q`ð¬¡alöi›HSfd$ƒŒÔü¥K²h£¿&bü(öhÝ~Ë0¦-¢†¾ñÌGJ–»w ¢ÎfóWvp'ì ª8Ë™:2‚| !Ñš%«HË/gçÅA Cmó†/b‘[äß:^—ÁQq±m‡Ê½c­ '"Ð4+®jèÄÅýõ©F°¶íŽìº ¦Ù¦"Ãi²m6B¢Á ¦È!´Ù ‹6› †iˆ ‹ ¦È!šb"Ãi²f˜‚°Úl‚¦ ‚,6› †iˆ ‹ ¦È!šb"Ãi²f˜‚°Úl‚¦ ‚,6› ‚m6Ci²Mª,¨°B¢Ãi² ‚M¶›m6Ci² ‚ ‚MÚm´ÙÚm´Ûi²!´Ûi¶Óm¦È ‚ †ÓdCi¶Óm¦È ‚ ‚ †Óm¦È †Óm¦ÛM¶›m6A ¦ÛMAA6› ‚MÚl†Ód6› ‚MÚm´ÙACi¶i¶Ój˜‚ ‚ ‚k¦ ‚éšéšéšéšéšéšéšéšéšéšéšéšéšéšéšéšéšéšéšéšéšéšéšéšéšéˆ ‚k¦ ‚éˆk¦k¦k¦ ‚ ‚ ‚éˆ ‚ ‚ †ºb ‚ ‚!®™®™®™®˜‚[C]1×L³¾÷çùñ}µõMîÏ\² NK^™ncPøÈTý¥Uù†bôM.jPß4¢€±©Òk¤êOGþÂâ{c®ó+×ö‚!i©¯bºR/$-˜­b«£cáHòBà|/á²QÚ×HäŠà·I­C>[ œnà“’š°B›†„ÖâȆEËHWÂ÷ÁŒ^–1æ~ËyÉI,Rõ¼¸ñMu1µn”µhFšeÙ`Y¹0¦9-höFŒÈO9=ò%và'Žü2Ž!¦%A’a‰ÊcÓ±EœÛg`Ë’ˆìÄ®û @¼ºÊ#­£Ó}¶ÕK¢Á<|}¿¨-ä ßòs>E]–ºVJ‹ÓÖuòw/8šù÷•hƒ B¶ ‚’H¥ØeÎ×”ñwhê]ÀºähŠB—kxüFƃ{X1˜ŠÌŽÔ‘õþŸ·Øô8/ˆ;Ô­—h惕”ìƒUE<øžÐÇ”pÔdåQ]4º@x(M4ÓU]Xnñû¼þ®Å^‡³P XSÞ%¨‰¾ùˆâûÉö”˜C~=€W}á–ßÝ(ã)Ãóc9O4%Ë–Ù[`вnS­Ÿ$çó×¹KNñüã"É9 qÎsh£FÚ ž‡¯…µeµm¶”ë°îžÒàú EõñûUC¬ÆÉËpI=k­ƒ® ÔUëÛÛm»v@"{›®KƆ¥%PBY8µå¯T›Õ=à¢R‰œ8ÐSMÒ¢/Ë·’]Ì-)^€ 1f½\É ø cÊ£4%€]€ª‰t¯^w0K_±lÝ]nD_Ç?§ÅÅ­bï¿Iq]jÖm¶Ûm¶Ûm¶ï½7­´hÐֲɀFsjöE”<Ó/Íï=·¡s{xèNŒŽëìÃÕ"žvÀzÄX&º²hU¢¢ûªnÏNÚ•þ úhHŸ¥5ò"OÕ»öqƒòן³btééôm½÷5UUUUUUTè‰br:r:r:r:r:r:r:r:r:r:ý·Ðw³óuö¢USøýó0#÷¿\fŒû.½¸Öp$uÌh/äÒ´ÃÆ/YÉá“Õ¶î+»Ú²‹ï¡ÏõhåóO7 wâ·›ÎÚÜ· d¶Õ—ðN &ÿVwÙLç8YÎs(¥Ó’ðŠ]9/¥ºcýð¦d0,((WU*°¬R« Å*°¬Q.¥Ò’ê]).¥Ò’ê1J¬+ªÂ±J¬4òUV6WÁ‡ U*ªªªz àÆ x|ÆŒ|ÑÕ»Ln4TM8SC£ÙÝÃwUuutpÙ¥uSg…UWAŒcNŠèåÃLty»ž¯ƒº´÷¶vt|\:6Wg“áËѧc—“†žöÌ(&3¨É¹°¦É,™2dƒ!AP’! 0 ¡e „,À‚…Œ¡ƒ>D ѳsi2K%’J)f aB À À–g fq`À–g fq`À–g fq`À–g fqt!ÃbŸ$à²RÉJR”¥' O <Œ40øèu74a¸hR&Ž 4c¹Á¹Ô§S©ÐàØÑN¥ R”èa†Ž…:œ0èyÓÔøÊh÷›Ž£àu8:ìyƒ“ÐÑØry=æÆ ÉJ|Ç™äM‡¸ØÂv;ŽÆ†äÜš770ØnMÌ)£ss †äÜÃE45'ÀÜH …ï=:kG8páÇB4âoe&C̼nE"’JZj®s¼îûxõ»ÞØ3×-‹tã_ ±¼½}®«ñsëúÿRªªªªª¨Æ?”ŽÔÙ¤(;}ï?ÁQI÷‰‹:G–ÙÌÁzžXÝøê@«é(lÕNÃc_åSøTè¹[°ùû€Ûm¶ß”¶Û~#å1óœ|'ÎÊ|§¡ïƒÜ>SØz)ê<¬ñmøwçqë»»¾Îà<îîàßpõžÛm¶Ü[m¾'{gÆé/ÍóßôÕʉÞÀ§æñvÕ;ëðF)×Þ¸)x{Ö¼ÀPÊØ)µÆØ6éjʧìúCǨ,õsä£s™¥©E­äSåT¼á¬C“e7ƒC5©“¤I6aã4ôxH±¯ÝØýPÈZ.áÝÖ +KtÑݾ5 +>E_o°œç2jsœÉ•«ƹâR€P´\çN”öÁÒQxÛmµ¥1Æ›clÎ B÷ƒî 09p uL¾e¤úqÅÁÌ-Ù] à£ê¹H”Òàà»!¦” Ý­bôѪOš•¦I ©0ž‹º¹‘HlÍo#2OAEëvƒˆf² ~•@JǬ‹Ð”¿#Ó°!)³«\ú ß ©zDj"d׶•‚”š38P›éåŽW/§º[×%f&‘„ׯ÷Z¼µ»Å’1A‡h<ÔÕÅ&š-^³Ë¼*k8 1¨ÔÅß”y ¨O6•Y8…,¸³SÎvX–´8ÔÕt‡&¯«­‘²Éü{À¿2 “Ò†GÃ/‚b}äÙÔøÚÙ5©ãõ}ÛoxDÅ8Š ›MoëökðUÂíÔ„Mód12´‘ ¹K¹@ä»7¦ÚГáZѺCñÖ[Ç/‚]Nº/ž“©‹;DDÞ梬SVH–*9Ši—¤‹›É@†™#Bð²ØÑ5óuUZGPC†ÑEX:¨¢DBc¼Z@…7âù¾ªô „eÞA2N6ÄËd@y‚;$°SåʪË+>G‹Z¼^§¯ËËÓÆÞÁÙxš Wï‚/_a-†ž´ôÛoN“*HÇÏ 8 ‹Ç—®vùsW‹Eü8«)õR¯Ç¼Ü Ñ4Ù1ñtaù©,–Ò»uš•lM'6ä‚S=4.'GØô””VÈÕÉ"€å ’sLëý 1žÂïH”>PÁJ]óÕ$Õ‰EÉܱÝS«$Z&â#„‹¶]†ü<ö©Dj¨<™ETñe+’4º‘£½pdk¨²µUk5¥544¬¹TE…qÅu’ÖyÅ*p-g¢MµK°š¼B8áþ "³+Þ›àoÏ<žO®ÍÕ¿m´:nÓ¦í6Úm›´é»M¶†ÛÛÛCmƒmƒ¦í6Ø6Úllm ¶ ¶žvÛI¶Ý6ÚM¶“mºk³µÙÚìívvÛtÛi6ÚM¶é®Î×gk³µÙÛmÓm¤Ûi6Û¦»;]®Î×gm·M¶“m¤Ûnšìívv»;]¶Ý6ÚM¶“mºk³µÙÚìívvÛtÛi6ÚM¶é®Î×gk³µÙÛmÓm¤Ûi6Û¦»;]®Î×gm·M¶“m¤Ûnšìívv»;]¶Ý3llllm ¶ ¶†ÛÛCmƒ¦í6Ø6Ø:nÓmƒmƒ¦í6Úlllllm ¶†ÛCmƒm¡¶Á¶Á¶Á¶Á¶Á¶Á¶Á¶Á¶Á¶ÐÛ`Ûhm´6Ø6Ø6Ø6Úm ¶†ÛÛÛÛCm¡¶ÐÛhm°m°m°m°m°m°m°m´6Ø6Ø6Ø6Úm ¶†ÛÛÛÛÛÛÛÛÛÛÛÛCm¡¶Á¶Á¶Á¶ÐÛhm´6Úm ¶ ¶ ¶†ÛCmƒmƒmƒmƒmƒmƒmƒmƒm¡¶Á¶Á¶Á¶ÐÛ`Ûhm°m´6Ø6Úlllm ¶ ¶†ÛCmƒmƒmƒmƒmƒmƒmƒmƒm¡¶Ðé»MÚllllllllllllM¶ ¶ ¶ ¶&Ûm‰¶ÄÛbm±6Ø›lM¶&Ûm‰¶ÄÛbm±6Ø›lM¶&Ûm‰¶ÄÛbm±6Ø›lM¶&Ûmƒmƒmƒmƒmƒm‰¶Á¶Á¶Á¶ÄÛ`Ûbm±6Ø›llllllllllllM¶ ¶ ¶ ¶ ¶ ¶ ¶ ¶ ¶ ¶ ¶ ¶&ÛÛÛÛÛÛÛÛÛÛÛÛm‰¶ÄÛbm°m°ªM¶ ¶ ¶ ¶&ÛÛÛÛm‡ž¼ÑëíÔÀBZp.|ú*eÜV¼'j¹Ã«Ò}ס’1´¢Z¹&æMZ0Ü>s'Xï 9nå±À±ž4çRÛWZß‚¡9A=ô¼°·®rê—Œ(»¯]¶+»*øÞÄ]÷myu¡ŠÎzœ§}q¼¤±IÎ{âõ…Qj°çñíÄ’ÞЩ›[îo»&T¦¤X\WÃÅUÈ\/Ç~AªO£ÀfüùªÃpú¿_ŠÎ ï0ÙêS$]é‚£i©͈ÐÃ…¤¸ë]Ga×9.kZWZPº¸d¹êý[ñë–Ò|²¸ä&™¡YŠA‹m;D¨È‚1B’ÙαË6xq†ÖÁ kÂv®uM¨¬Ö+”ÖUñHãØ’4¦V ŽÞŽÞÜèÈñ ÙÂå“$ÐÒ¶š¸jcR6 qL 4Ü冖ò×z¹ H,ÓC‘¼‘‡ Ó=[ÂWY9ì°Ô…š4P—5¬WéÞüñz£.,²a&B% à„I±Öø•Âøuß"ß­¿Nüqvf¹îƒš¦Q+µÙíá¹xMJìÀ\ãØÙàÖìë§Òð¢ÃKó}¾¦«¼óÅú;ÝN4ʪóÈ)À ÙÙÝ ôåë/ŒÛÊ… ª,™ ©°ë 4˜¸çÙH–³‘†šWE8á½fm;nKu§•Â››K h`l3lœ¯‚tM'©=Ós„• é°f·4e"*ä¢Õ­ùñu¸NYŠCÖ°ñ@oÊL\&²ŠåÁ]am‰’˜$É+±º&¬›šŽ 48¹ÚÆÑ…ZÅk ¦;3RSQ0³ÎD Lz˜•&=Ù!Ól]Kn·Dó„Uš>iIÀÙ® tÒ3a‰…8¤潪u—¨±xõÀé©âÚô\že<…F­9œ Áºá¿Zß[°h½iŠ®³ª@¬º~J’E¶éëØçÄ8 ú$¤IkJYL&Ò“Z5 ‚õ´DÅ=ýSïã¥ûë®;iõSÕf©M匟/k{3] IAÕ®TPŸ=#‚”>;m‚·Èx„pª•DUÒÁv9 ‰£,ºÍÁTx’±:ÃÅVûŽª”F‚ê]Ú®×õÜ2רüþ£Ê1“&ÚFŠxbŽ¾5Ó¬,/$‘n©øŸu2ÂUÍâ5”7Qwö_a3s–z!é-,¹6V–ÓÊ„¡y5†Ýhê̽Àü—Ù/£òâÓùŒøÁGæÿ#DZz@I0±ee‚ö¢Iy#¶|eh#±?YÖJ•YÈúøÇv›’DZò]°¨O·ï8h¸'á÷|_4ø ÞYD¡dÀ &1CÜ ™U£SU‡¨ØìºBõöÇR™\e‡xðZtD;3ª%rÔ1j½•jvhØŒÎ1žœðn›Tèt Wž-Ë´R5¬5x’—L}ÖrëÛÁž{4Áéã‹ä§}Ÿ¡ÝP7Ó†³¤—“IÒškåÞY²×Ž ÏÆf1j}¹&…š­`¶pù;’j „¹Ì³îWQhËÔ§9kæ°­Õï³wÈ^1}@N±çiU·[F°—j+í( Ö©ä×'Xw"³î6­ Ö/‚õÍåRõÚSs:k™Zéy%¾ ,56•+ÕNËXFĶ¡ìÒ‚Ï”ãyjÛ”Ói  lˆ‡…#—í@OA8Hp{´‘÷O³««¡)6Û|í­„F WDá˪$$’‰JµôØÑqŒJ-uK•L&Ñ-2© RR 6Í´ûfüB¤4Æ›P8\ósÓâa{ªä!àP" tA %à¥NnÔiõEá˜úoóKËÜv[ó È—;öm'68R9o¾/£Ý¶Ú¬ë¬îA0¤·¦j ŒÊ¤IÂí®âk +¤D5ÒPym™sÄUž!Ötî _PßÅ>ç”AÊ⚘5ê°’`€CÖÃEâÑ6÷îéø§†”®bñÉ‘C\8¦£¶&½¡ˆqµ@N8ý‡yÃ^eÈ/¸öìúÞÇ:Ç2ìë‚ŒcË?›x˜ ©:±6;Ë®Zw/€9*‹©ŸOÓý-òù|AAmšÉ€ðˆ’Æç.µê4ñÐ ÙÑ|é ÇÉ¡÷©ìË `Ÿðc¯·gÈ -V«#<)ä-N ÅVy!£V­Â×£^ïH~<)™Ëdþ϶j«5Ü[ÒîR;þ’ŠÐpQ]x&„`ŒsC:˜ ˜Ä®¶cÞoäqUÐ3Õ8çì~Œ«ÜÇ#ÇŠ!‰0ŠÑ"j°ÞR8>’´»à·³O-yS „´Ý$CM±Ðk¤ªH¤µ”\Þ¶$ ™M\S0 ·ãR-tëa”qdyIÊÍxäTˆg”ÑTç|ïšÔ'Kö:6•'ß)ÈmotAn L­9ªÃ[c¨i—;ÈW>Ï=Í4À!,nĤÖ=c ˜pTd-ƒêOO&œrâa Ëï!/þ>ÑΟl½Ó~Šž¯»Ú®\yú/ }@ê֯쌆#lGÖ@[fÇ‹°ð´¿¸~£õ/’ÿ"èÒB@”A© B@BÓ!ñ ’_v$€î}µ¡"¤¡™Ë3Q¶fTÉ&Ôn’ÌÌpÌ0ÑÀB(”jôØb¦–iQf–lšÍaE‚ÊJ¤0Y#뉮Bžß׊‰ûGô}ÄMiÁ>â"ON] €J}×’>e=€øùx‰*‘þ¹$Zª×a!ƒRTùñšM@¨$=C¨Oˆz]==¼{¶èv¬ Æ=@æ×Ôt©?Þï9_ˆ‚?§ú»½›-ÿ_÷ÜÎã±sŸìº!|q?ý.öä3A¿ïÿGûð÷ÿ¯ýy—úOW¯þ¾?Õ¥^þ.N»!im´ÿe6v¥¢SßcyÙ Ú­µî±ä >À÷TSAóž#ð«â©ÑA=ëú~Lßâ>$!)Õ×·ðõÚ{¬w„F@IHþh©èó© kP§9y¸ú¼ÿó>C áø6?^ë<=¾ø=é~‹‡Oòx8Åÿ…­ï%õáQü<#¨”Ë C<ÈKúÿ_¿Nß{îøüÔðóy¥æº#|¿í=§šIQz­Õÿg¿÷ Ê•…õJ ¼†—­ždÙ×3ß@(WÍIøç@y¶ßšÅÿ»cñgÓÙg9þ>Øcç;OTÁ×Ló$Z”¦oJ]ÕÝ»µÓ°ÝfZ+¢3V6,U¼Õ ª ”k¶wèþý:~•üëÿ{Ð?{b¿ådYXT¤XUCþRF°aÿ€ÿ´Xð?ïŸèþÄÁêü#ÆGùÇÃË‘UêyêFÖ‚wƒƒ E$Ž¿¿vÊ CY0A ?edDT­ó„F9†×ãèd­ó{rÀÉ«l‘†fg8nŒ7kz4Ú –¢4NjhÑ­Yhk[¶lÜFXiÔêÂ,(Ì7¼Ñº$Ö÷¢¢¢Ù‘c0kfdU „ADËJÀ¢¯HM(=ETت˜ n”ÉŠL¤ªŒ6µµ¥yܬ¬Ö+++)*AŒœ0L-$®MBêQ2É)  ‰"eÖ‡$š\ò0£m¤¶Ö”V«MM6ÚÛJÐ6!*ÌK HšR’’Qu*L& ²ÊÙn¥s¬¼Úk´)$¦Z²šf % B82Áƒ‹‚iL†Ï;mVºÅSTŠ±G:y´ÚÖÝZ[FiPºÝæòã6®ZÛ·WhwJC”Ç%M2€’ ’’%‘2ÆB¨¤P‰€« "JŽ2(䳘¢ºLªj BJˆºDBPSCR+¢_[RÖBº…¡hUuRšY6çDªa+’ˆ™"R`Á îM©à¡ DܪP™)4)ŒBi)%C!iÔ"È“,HcûÄò °áê –Z‘¦‰(„Iåû:?Ùþ^’ýçòŸä3ÇÁ£Ñå‚A†Bä*¦>G›´´ìê…U_÷À÷Ùòëù¿2QTîíÞkk4 ½ç¹qDSòIƒ/Bi!L~°ü‹÷*/ßT6Û÷ŸÇ#ôóöú¿/Ñ/ÄÿOðÿ雟銺ÚÖÍË^óœ£ImYØt¦mŒgžË­ŸOãù™8ÆHó?ËùÕJÎ?4‰Ú)J~sÌ€ŠP‘ù+~säžoÊþ[HSY—ŠSþé] Eö S?°]‘Q9‡¬@‹ âÍ;|Ýþ?%vð­ïá;ß­¬R•Æ1;ã­­:㽯|Nu®1k;¸œñkcÆ#Æ1ŒWıŒc¦1ŒOÆ1Gú*UÑ‹?[wsMÍ|gòµøá£êœž7UÆýsÁ½Ð×w³…u„ÿ†0ÎõÏê£ñæc2Œ(d3!Uš§¬[|ëòšC9«-kŸ…¬Œ²‹caFPrƒÊÞ¥@jÖ,DûùŽ ÌŒ&Y¶±ìþ¯]è__¦ø¹h]ØÂJó-ôð‚sR)7ã™P ±×‘Õn¯érWÊÏ-+=ìºE» RÌ”‡%)¹DŒ·®dÑõAªà¼ÕÏŒc"’ƒM°Ól4Û 6ÃM°ÓlÛ»¶6îí»»fö¨ˆ(T}Tµ¼§·&ñ(‘¹o5ïWP³“w”Ré†Û¼EbÚQ-¡US#ák»xe²Ö[Ã-–²ÛsêyOú¿]ÍVýùñWYh»õôÇÅ«w-ÂfQŒºzåkͯ‚†-trg1Eê&Ö׺Òê”\]ÚwÅ@ln^ÃÑ{Âì' “lzðÖT¨C*ï‰V|lBA«îÞ–% {(þÒ<o-@B]#cø–¹ÁïäòRöEQVþ7¬ü­u¦´¯²/;#´ž=evO¶úk@B€HàµPv•5Ç&»Íª‘òü¾ëôYe–Ye–Ygý9ðüþó÷cÂRd?†\m+:Ö¤Õ\ç8·äÕ¿¶=9¾ =2ж¿…§ý”‚©ç›‘£-Hv‡Y×èrüÎåøýs«nÒ©ãG‚&†Ž!6ùZ/á{b¸®*Ø0/ç¶kõƒÚÌU¬Ëèñâ«·mŸn®ÇmÓ©ãn¦m~ÖCòK6"eb²ZÕMUÎs"Ç£Q³Ñ获œßž‰h[SÑiù©SÏ7#FZ8óuxwAÃñy}Þ/†y/‰ùAT«œ¼0¦×š-/šòò^É)•õ=<\h¢öYWÝ¢ÝøÁc£kà_j„KN‹\:ÍÈ+òóñJÎÂжl໶`Ø£ÛÑÎ4÷öS…Ý“T­9‡7Ê•—;výYï \%¡ŸH#>ö¼«Oœúl.IOçãÁ¼®§+^ÊD¬·¿QkzE]g{¬­_öZe¤R_@/FP„¸OI1ʳ°Ìµ¨ÿ“[YzñŠ‚äXWIHz½Öæøå̂묽¶ k[;È0Ü—ej©X"Wz19„#Ou¾ï¦þ_†}ü×Ñë^µ´}"¥õó=ÇäghÈ vvVKáŠ|WúíþÊËÎÏ‚7ˆ>cð󯡛Kñ±XÆ4½d [I$š©‰v¨„>Ñ_à(*J©ü±J)þcþ‚#ûOñI$’I$’I>ò]/æßÒWümÝŸÜvµÑ¹up¬:4ÙýÏìWG-•»gWw.­6Ììѹÿ}ž¯Æ7uV$O4¨Ê²Iw¸5V‘rP%@IDÈC$dE ƾ\DÒ¨‘TÒ’üÖ’M!ÕîÓ|i Åêjª´¬-ÙÒ{¼sVòî;È•þÑc<¤SXÊ?œû׈ý©'ßò!{п'Þ…ï6—ýè>0±OéB÷¤¬I ²’ù­ñ‹ðä¤ùcèÇ„.'ÿ'ðwœæOl*Šþ÷å4>´eUk_ÉüÜãìtƒ¨äÝpû¼ +ÿD?‰S˜R”h*©*ÿWo?ÓÎm­sߎïäUUUUUUUU(¢Š(£8ÿóWWvó:v|«ZÓR—‘$Ÿ<$,yfe™–fY˜Z¢…ºPV­o‹÷ Rºùªõ«Óm¶Ûu@+sWU\0|^ø²Â´Õ…äm¼®3I º«¢ï)@&ª‚ƒ5Gµb €gè¼ÀwÅQtÝ ºÓlÖÄjQ6a£i™¯Ëó™.·ïƒ…èòÿQû»üßÓÝõÿ¿)%Ö&µi$i-yû¿³Ýª¯]ìÓƒ>¿f·ÔPì’­* H?ù# ʧE9ÁSA Þ`OPN‡NÈiz‘ƒ*KèÄ/ßþ—[[WÃi¿€¿ ˜íU´.ŠAýÅšmœé7žmæ[öõBígi"Š«fçH>Céý¥c3Œ1†®®à’” v«‰`ˆ*X¶…-¶ßΞô÷g½"}ô¹í5K˜¢Ö=ú24øë4`P¸gZ_çâÛáò?÷ŸÙ*TEgÝæoúaÃp›ƒ1óÌs[³2Ê0ñÛî`M:ÄWå_›>õ—ß-k&Ã3ú+@¿¢Éá' ˆOôdðÔÄ¥…„¥…«gô_ý{M’–£ Ê¢P”(×¢ˆ‚^ìLn”ÓµÞ^y5-DL²¥Q6[+þÝM'_ÙÎqßþŽPssýv  RŽºó|ÿã±-¡*¢Š æ§÷"DyòÁ£L9Ù‘D AGð˜ùéuìÌ)‹`˜(É^Û,023 1½§·“gâÎ&G1,;¥ü~ÛHÓ}öØÃY‘•k‰JôɵwÚ]ÚØà刭7âV†"#M°ÑJŒo(¼-j•`1‚§a!ŠÏ£fÍšW hÃ,20Ò›` Ý›8qeMb¤*hÇuÙlm ¶q›^:¹MHÁ|I$1€€a‡w•?›ÛñSŠó DE -ûüó&¦Àõ '/DûÀž€+¤dÑ•Ql@óE«À'wÙÎV­YcEª¨ºû¬DdvÈHÌOüßoéÊ:Æ–D’_6ËùPçd,W]cèììüÿ§Sv#æ]J?ï… @Aúœ&ÒæF­!S©tJÈGÓÓ—Œ@xKÿQñ“×ùûp Ô ÜdÑ•QqÄ„4©Ø@ÝR“@?¹D`Kõ2‡:+ ß»õÏÅâ¤~?×ÎܹN™¦mž’ñ0K¬kÐÿŽqãJ¨Ç¬õ¥(By=~‹vúqMtSæÒüpR+¿àÇïÈÂ|¤ýŽUøPvRP‘ËÁŸ”Òè.ÑÌüàÒ ½@Ñ2B©¹˜ëHq×^¾¸êhêh,ÛbwâdÚ6š7~m„.‰ £ yøñ‰&3‹ú%=pžçÉÀYóEþÄyò6o¾ýg]à7hËÜgD&L8o„=Â9p·È7h݆YkQjg9Í µ–ŒµÁ †€–è– *‡Ào¼¢Ý‹f€Z³]!v<´-A/ò Lç5k?»XY†gW]u]]@q× )@ m¶§IP«•KÔ¡l²û¿'¨„ÿ"‡Žîì¢Ñřţäx(œŽ5ÜsöÕ Cé_ÕåZPÜ(k>kÜoZâôm ’ªi7?ˆ¿Q™–5­j´Tpµ~G[ã32Ê0Ø|™†‡ÂÐRƒã 'é›À÷‰÷~FÐÚ}uúž¸/Öð‡n€?lOŽk ¸ó ªªªJiù¤žÚð ¶6‡t½HÐx¿ÄJ^?W«(Òà …á>9ØKÄi¦ô¡ la=2Ekí—W_ÍŸ¢½¦†¢ÿ4T¢7"»Év€Iwÿ^˜Ÿ†Y&›†âi 0èëÓ-Õ¬ú¤þküø¾¸gŸ¡ I1@úˆ¢•Z¿**:ü/òøBUA×s¯±ÄÐ>5ëô¡U¥/JabHG½ þÎk—ÛwÓ*2Œ3<æ=P®»°¯{ßaèBÝ]tklÓ9bÜ$²¶ÜÑg=4¸´Ì)õ ü\t—¸ ”qÚ6ÛköQµléüèZ˜ë…ÌN¥¢FÚÏ]Öó 8:Ò/y{ÂKöd‹“øJ! »ó€&4Ì xèûª"}pýH’ ˆŸ¾ý) ¤Cý…! ˆ½¼ñ ÌÊ ÃcG®®ÿ£Á!#Çç»vÙú¿Qa„µ Eý>©üò•å0þð?é &•þ”÷ý±Åj|Ó˜ëðöí¼ÚËm[à? ªVI ºÄDDD ÆD¼þ} k¶\E­×éøgê´âÍò.÷nî_H}þ«ÔÕ—߃ä#O’'-øp‡áé¾×Úõ¬ó^©&…«†%4ww.}´­:9cc㸤‘ :šiA$g›B¸šFTëàŽ“ãsáƒÙ³Ó¢‡ýeú@©9|ýFø &OY«ùlS#&f=/YDŸªráÆûßdNÕ4&L52% JÝö$?I©ˆq½²ÃôÆ\?¾ÿpü±:ÇœôŸÑSÖ6~üî‡OQ,b§ÐuB«§wl=Èn"-?$çcS¨h0¦Õ=JYˆq À´¾sg-'j`K ÄD6àmKëEIÓà"=¯-„YŠ[ÞùE¥-¸pŸ"þT6Œ‡é¾ÑŸ›R:„©$ge”¥âwB!$Ä›´O^xÃðöø±}/\V™¿d5æ±€Jža_À´/Î…ègÅï¶ß·®Ê~ºÓöåfb»EÂ!cÎ/×1í6îïòU€¹_júÄ’?(! D8âî«rTü¨™ª5^O'"ô¡/èB©²ù¦¬Mà(WW5¤mᔦ}/…aIñ"ÁTDL_I›ú}ÝWéÎOQo/ªg•©<,׫úÌâ}ûWT;*ƒï²Ä7$ÌÛÏŸ=«Õµõ‡{cÎ3ÆX(iJ.ÎJ”+W’¨ù¹™ ýÜI&w}Ö¸ÃT°Ö¬õÚ㘅½îÍÖ<Òf]_²ãLT«x’qƒï ·°ûØm4ní¾´Ú¦þé{KÂï=å'Ûõ¡ Ò×ã3>ßÉéÛ”™ä”%«´@ÁÇW©÷ÄN(“ãdz³ã€EÆÆš;Z@­­¦e9k7ãÚØïÚqŠò®'#Ú¯>ºg2g}˜ózÔÉ^A^Ž >ÊFUoÒÝù³ôî?Æ !kÒKÓpcaè† QB¢¶ûDCx}­ÊQ2¦Çè‰ó'²Nöb^v‹¯ÑÛFà‰ˆÌy;}Øð”«^Þ½úƒ¸¦ÆžÃ4ó\3H¸Í9ÇVûºy|Ö×_$ñͳǪé•U´—Ø6ã|ù—ñÉ—uØ—hXfÏSœET"KèLÒó*˜WAÀðhJ'ÎI#Qš¶ÜDoϪ_Áª_ÑÛú™ÚÏ@Çf’–ºØ>IÄ6ÑÍ3HàÃt½è¼ÛíõM«Õà^÷oni6„Î{׊«6ôàKÁ|D6Ñ$ý1ÛM·‡é¯“m¸áÏ6Ï}¬Çíñ46´_O2KÍÈc{èõ£:bYسœÂ*ßßGZ/¤<‰……°š3VÇñ†üÕypêõ{ß·ó 7Bö¡tõ¤0 R¦2?[*ÿ5÷mßÏ:”æ)ã0~å›ú]‰¹)ÈݪÌLþœS“{´å2ªËÍŸX–¸Ñå¼#€N§þ5dýße1ü¿äýñËø¶Ka5©4$×% £94Žñ`åþi$,-¢–­ÿ|°rá)>Ïóv‚ÜÓÄÙË»FY!í®Ý‡Í nÈÈ| ÐÖÄ„ìHÿjÈ—Xƒü5IDLš`”qú_¼æÔ9Ÿ~‹ý¢ªÊ¤ ²´ŠÒ£RL³ ¨&™5)´TF-¿£~Û쵿Üú÷ýñçL)8ƒ§BC ú&UB»Ï"D$õƒÑØCè¡ËmRSyì)Ú5£­©2ä$|ÿÎÿ¼d? ”‹ /®L ¢P¤çò²$¤“_ì ŸAS­üõ ’°ÿ üååfƹ1_±N®¿Üódú\?Ú¦Ï,i²©H$`ɒ䌌dÁ2\¡ÂÅ‚Çè.ªªªªªÿÊ;?ç©>Ä{Ñb}Äú0CH LØíûgã¢oѪšŒ­F¾Ü™j% G•ÚƒX¬ŒK`6@O¡Ô] BX”äð¼lÌ Š×y¦“}ñ6X‡|¼[¢J 9'¼#O#µ49Ð'P:“Æt PÁÒN„¼ø~/#Ò!ÏJöyB~ïÀ¯éõ€ƒú$é Oo¿·Æ<ªò€)éUŸþðýƒä2ÀÅóGÞ9õɟØ0ü£'÷ ûq"¤¿Üçzä›ôª_äçGøËMñüV-?’­_ÇD‰‡äbüŒ&õ·.:W”©ÆT¦ 3‡(.÷½”ílŽ#Óÿ ¦ öJsý'ì/õìœÿô_sX÷}ÿŸA?ÐõPD•ÿp¤#Þĉ!$-¿œýßý¿õÅÐÀ­¬Ó(#«$ÖC¶d´fY®·Îk‡ŽVn»GÓÇÙ 4$ÖüÙU)Sø¸tæÜ+V‚sþÿ7¡£tÓò‰þtþ€ Õ 'æˆòQë(Ê먈$Š«m¶Ûó͌ÛuƈŸp'ý\'þïqÿ,‰×4õ5mYÿÁõmÒª¡;× ®äÉ•Îø«%• <õæÇmï{Jù×ô¨ ––ï-¼¼’I$’óV¾Ïö[þFeºHµ"Èl ÝÉ:ÏïS¾V<5ð£Üö O|‘Ö'Ϋãéÿ2ôQ¤¾~ãÏÇý ‹/# >£Hÿ˜80C š¦W+²™L¦TÊY·Öÿ¯Ë„ ;(B¢c ‚¦I\d@A0€Æ&?m@e%•q”}‚mJ!AÓÿÂ?ð„Ù¿îŽeî‚8ç“„„z±´ ¡AŸÒYJÀ¤M͉dmá>½jÜ£²Z7À˜H®¤4¡¢“ü:ß> ôWãŒ4>ñ/×RO¢ÄæIJ%‡Å`“å½ßâÝõB8û8'"t ¼íu#ÒB¡¨I!>Â}½íª¥-óffe»„î‘Ë¿kv'Û ·tNë7I›‘ª2%IlriÛ¶[•#,‘B…¶­¥T©UUþÐx$ô%â`’ ©¤4‹!×iÝ<„I`Oµê„P›!Sº¥z¬´ª)bK_t÷z„§§ŽdˆœÑ- jÔ$´‘ V€µ$ô#ÂÄÝ<Óv¡:PÄ%x'PÙlt„%Aâ¥ARqÂb†ýFÑ´mFŒõåã—H¹&•(Sàêªé"þhDO†Gî”ÅÑôf—=-÷Ä‚2Ï¡>Xóå7ƒ¦ p  ”Js(ÂlýŸgïö宅=ñÀÁÀ¼9|ƒì—Ü# ëb|1AE ÄZ÷Ö–«^ÕYjtO÷¥Ù´ŸØ{$ÐQüaœƒ.‚$ü»Hžô"ïDË$ð04ó`c VY"‰¦a,¶A)÷•ëýj]¾ÙõHrÈé<ñî³i Ú !e‰ {¹)5Æàê@rc&¿¡–4·š¼ŠæNÖV¸š°–k»ÀqQ åæ<;p‡$¯Ó(`"È°"ðsó¢ 0h£FŒì¸áÒ¤æÈ×è‘ôølpí;[ 8ÙÚzL¢dƒ¦f\QX]dÅUj”tÛ L©f$o¼‡ppÔˆDxE(aÒp˜I2ÈF¤yuøž‘äA± ÷:žK$¤U$ª"”BÂÛLDM¸'¤BnÞ‘QH¨”Š¤U K)DTà:´On€šÇÖêC¤tI’x9 õ„¨K/˜Ï›ú}‚I!$’I!$“ÆŠøYw²²²²²Üm«Ç–²ÅgØêÿ]s2ôvÎ3xžs¢¯¾”ã»5a(Ç2“|ü¿_ ñ½ÎœŸGËß.y3“ FÚë)7Ë—.Så{œ9>\Ž@Ær8NCCcÉáᦕ^Ïg³Ù³ÙÑÐõ{+Ùì{ SØô=Obb†Œ<ƒFŠSØö=ccØèt§±Oc¿·¥óÒšp¥%Œ¼ôEôÓÒ™Ò”–tz[9½óLf”–2ó¢HHÖ•áËN/¦½/]útµ:bV)ÂûÍò¼Œré¤:K~])m)I_/[g7¾iŒÒ’Æ^ldÉræJ2PݧWevrv;‡cs©ØÜÜÑÔdd-œÞù¦3JKy¶s{æ˜Í),eæÙÍïšc4¤±—›g7¾iŒÒ’Æ^sœæÙÎeŒ¼Ò–3™Ï4ÆiIc/6Îo|Ó¥%Œ¼Û9½óLf”–2óií}µØR­u­hÓÖµfdmæCTZÖ½4nõ­ozØ=kZÞêI­l.I2³2ÌÉ•™&fL¬Ì Rs+­Wç¾4­å9c9ß'‘ÖbZrÚSè+ë;ÓW¤õŽ×ÎÜ Ëp3-Ê«®’êªêêR€>ß jÛmÀÌ·… [m©$-–×N¤©$-I#+3*ª«ï¨¦÷î•ÌÄø"bR "`¢H‹ïé^èT€` `ò { ðè•Ujíd k·«puÚq~.]rKÁ+’ ­ùkD Í…|éÔÕ\ˆýZ½®¶¯”¢„kQ­¥RÀcÕ7¯:´=Ò Ð˜NÄ©’j ëïhŽ$‡Öé_W’¢ ½n­ªXZTÚ°‘Õ¿(åU°c¡ÔHªT²‹Bªˆ5Çã‚›e”Aá„AÞÁK# <ÌI-x>Ä‘i‚ [â!8ßbïÓ„N!U"‹Bª–tÎ!8ãëY<ä8N-…Š¥$¦TÒU$¦TÛm•) h¶¤™m¶–m%“¹g<áÓ·c¸XXDYäª~™Qëb>$ÆÛBH%Y’ÜÄÑI"ñ5¾jëF}M÷I-Fä¨Õ#‡“rRY‰bR &Ÿy°K5%$sk êMlÖ–+, ᛓxÄ4h„4`4ƒ„ØàÜÜàê”ìájI³´»§"Gáß‚7Mê]ÉÎO‘êàBHéDÄxë£NbmõÙ•IHNöDÝäˆÚ wž ui¥‰VR²D‹$´«$±R,Y"!ˆGRcrQ§*"˜/¼€ƒèh©þÃh!Ô‘RiDOn²ÃiøÏkõrOá6 +H¿©ó— y™™™™™”HÄ’,’M¼`"€E Cy™¼-æÂÍk~@âÑÙ*’ Šªƒ>…Aì‚9òø bªr»Q}TU¥JP )@ IøöÞȵ¨ª$¥ÕAZ9$,D– G´Í[å–ÆTŠÅ«Ú}~ÊϾõZß.wòD‰/'(äž¾€uiC¼ÛìD\á¸Éá¢8¾¼W:ÕÒFÈ‘Fî¬ò:¼ä<ú˜tiØÇ@ÇF¨ªFµ•¾uªHX–ìÑvžèd¥Ã8F°ª­X#[Þþ³V:/^ Øî$S$’09‡G=»o’Ø$lIB)kT³t¶îèÕHɹ>¹ éÑ"¤’FîÌí¿nÐÌç;·ÜvÚ‡Qæ!ÎÈ‚Ÿ²Ê€I‹NK'ÎA+²#‡fÃa çW÷Œltd*uA•f ;˜›iؘÖJ )°&NÜ“blNO¼›“©7¤H7½×¸+¯WË__}ßî@×Åë_ªö’I$’I$’I$’I$•UUVã ÍÑ»t›¥”¥¦R™”¦e)™JfR™”¦e)™JfõUÕz«Õ"c²Ë½ u°­»ìàqý¸ÀNJg9‰,Ã":°x4lK¯_ ~,œÔ,ª"ÑMôßSþ¯­ì‰.Æ…">/vÃDèJN«~Z··è÷íÀn]$’Ý+& ÀóQ÷Þ¾ƒÑç ÁŽtì#h5aÌrªœ‚ŒrÊ©ÃÍS¿À ô¢©ˆ¨=A^‡ŒòÓC0’š3fTšfi¡“_/Š©J¦ÀEàPÊ—J1Õ¸s3#ØÀöùl ‚-ˆ‘""B©† 0Á†0¥ٖܳ.Y–}Ò“€¯%I$ìÔÐMÁ:“D×Ä–F¤Ž™À% ’S´³j×""YÙ\ª[JªíÝ*^ÀÔÃRRë3CZÌÌÌËl°¦jÊ–¥ÉL¡3˜îë±&áºnZÛð­ø]IM'wtõg(ŠJ‘<¡ÜI¸œÍob"<Ú¯7xˆ*·–ëÉJ•J­$F‰†Š)E(¥7¹Vì!”)u«—.’AÌéwTNI¾HjÄWG'šðä„•ÔN‚ÄîMµÞù»NÔ›[(À‡<ïŠaÔŠFóTΙØ ¯tVø¦q€ó½Ù\n7¸¢°4æ­€6S:g`8À9ªaãy¨¢ŠÇ`;Öî ,Õš¿&Ä ò'¤BG’dBT2'`©!ÖIémEˆ9I«m]ÉáåÎÎhŽD£(ŠA™D´µòÚwêI: ÒHû‰yˆ.‰i:É$xv›ß=‰”Ûg—nxâ;$¼U«9ˆØÜLäøØ=>¢©»‡c³ @)$)@w@ƒN-ÅÅÙYb£²™¿a78¼Dn¢PcÍâ­tCWÞ´–ÈŽ8sÔMuÖg'(ê×oÇmHå““jä©1íºæ6BïX±—§TGzûUðç]ñó®ÓéæÐ’!| ¬6½å‚)l/L2°1‰w­„T à¢RHta´#„s±ÐMº9".êì1Æ‹m–µYDDFF¶y©ð/팀ƒ (GtnûSâ=osëÛt¼oÂlDf­ª¥6~]~î²Ó«ÚD?ô r‰=Ò;þ!UÆù45¾´êáHVHèúÁ-Óö–'¢¤ƒú¢†žðdD‹€° Ó±A*€Œ÷[!ÛÞQ$u$Žá # ˜¡Šý’h>LðQ—ÔùªCr#™ƒÎÂjN¶ÔJ¢~„lzúYªŠ½6E܈¢øàðÖw|C#³¿¡ùá»àÃ{ %±$M'ß ¼D>`Þm§Z¶UJ(±D"ëÅkµmïúgÒªLÌ&æç‚Y2–¤GÞ6&Gœx ¤ Äœ0Ÿ-Ž±$pMøPÔ¡,ªy÷€9ô¯¡ÖZˆ;4J> &ÀÝÕ)âNà rÅ UÇÇê(‰¢Ë “d’¼"G·“ÒˆE¿I(ež¤ÒNâ.Dªõè¤G?h˜ Öm³TLPº.äÑ):>;FÆœ8yúvåÜœÁ’*È{D)#¹—¤Ê܇ÛžJg¤²GÒ–Á5C(eU*Qßl†IXÙÑw¢X°±@*u€¤Ðh¡DDMÛÕO¤²C'‚Qê³×«¿gÒNä±Ðɺ3’Å°ÀR²R2Pµ"ÐÓ‰ÿN†Ê5 d“ça$qõu#}¢0“(Š¢ÂIÜBH¡ÁÀ|ÁÄ9Ø™˜x*ªÀ"‹ÃÛ¨ŽbHëÓ}lGãÄšÑ3Ì0--"Ò3EC:Éê'¡Ð–’O¬z¼ïENùr´T‘ɦXNýôˆ’“y#°ÒMÕ$±é„Ýì&æß ²@ñ"$w|I½'©‰bIiÇ(™"¼„#äbž²Utwˆ¢ŸY¾¨Ó‡•¥‰Š*UPäzá'H Èóø<6mø¡ݾê‚IR脃xï!ñê'rCë«b ‰¹6$˜N=$X•}øø'bY›‡ÂI•áÈž_l…&—¡•:€û±W @¢/“º 50B1%=‰òóˆ[#ÙêÈ)V,‘Al‹eQìÌh¥fÏZiCi¥>IûÒ§ß ñ’('ú—ÀLEO¯èð^–ö‚ž×ÒN uB" ¢1ós§vjŠ®¥QjRåÈ-BÒæ…QXÀ0¢¡L0)™-C+4”‰½l HúdFërI©D@‡ HÁÁY€qRC”;µX«’muUe¤²l¡’F`.!)Œšø´«©v”1B¬-’+¿üºöxÉ×3>&Iñ­îÿdú¸5±Ê¦¢­^6ÓS5†¾ð¦ p ¾HD„3ÚÐ"éÈÄ`ˆ:UpM.¸®t¯0ö™%F¬‡6ÛÁyÔšæàÙUU‚¶i&›+b”¥0)±¢F–f1¶Éve„ºiˆXQUš¶LAFµš% ã¥wž”–a T'äŒ'ru‘6óNåuu"9N Võò|Q‘!AŒžˆò}Aã©$òG$…ªsÕ܇ړ œBvë·¨OTH“µ‰'|* m\bI„FØà P++-³\¶æîê´×[Šª¬&…)JU™$™ajX žŽ0!Ð!I5ˆ˜)pÆp˜¨¢àU¦Æ@Jœgjqœ˜T!ÊÇ3"qœš±±„TI2«Èi ñ;ÈèØyùËÁ.êÝäU‚k¢³ðˆ"÷rHÚ`™d<ªI'$:{’'ÅÄIåÏO ðöhæÈŽ15²d&éd  cvêØb†Ó11ÚÍÚDÄC;B¨HLŠ’ôPj’ÄÂÀ@u·˜ìs¸ÃVãu­kƒb¡]Zo¾FûÜ›L1BPsXÖøodÔØɬLF¶³"$h:1 HEÕV/ãfѳXb+5š °ÕŽkZ'áòAQýÉa ú s׿WØÎä6á{¥ Dõ!¦p^Kñ"rì ïàJþ!e¡e¥„„7„Z""T“vHüçw"$ú¦öê$²ôX„Ñ=»rM¤¨>8:f ™ ~áÌÌB”JˆQP&J@ MŒ(„êòTîàîª"†Gs@}¿Vëî¿MoÙÌ’JR–dDm"I1UroQyå!i8’"v7“$8£ˆ‚=ñlÈ´Ú-³UY µ½¥’lŠG3Z C5! Æ¦!€v ‰Ì‚#ÿ+*¢wxñù¶¦—IÐ:ASÖ«vÞà ëZõÛÁƒ¤’É%’KR”¥e)J”¥,Õ»‡0¤³"5¿(‰&Zåö’ŠãÜ;@Áìž;tEkóx )@ªªÁX'!ä°2ˆh!PÄ 6lÜ£¥‚P̨wJ¡E@x‘ PÃBJ©ð<JÑT)HÔH‘ؘâ]'©*ezj” ¢¢6(Í¥Vì%!JB]v"Mt‘6F‘:AîJ6vdZë ">Õv"$–¤ÈŠÎb' çdl4>7m&ŠMa‘ £Mɱ2!‘Œ•aЛњdiB%PˆS)eEL# $LaHª2fTFD˜£Ê,§YÊHmЈèôN•¶CÒÁUZ`ˆD2ª • QMâjªRdRå¶ÔYY A±˜- ŒÂhDÕY–ÌÔ3­¦Õ¸š¦© ’”¯>¢§ðú:yŽ&ðhuâ;Ìl°d1`ˆ˜H1ŒLsV#)0,ÂÌ‹©Áx”’CÒfŠ†vá1Œ3’nŸP†/q>®ÈlshC©WH£FÖŠ¦•&˜©iÌšI<{t%‘!ÒY©Hìôëû]ì‡Ü‡”èÔ~{è&È¢q½ž å»A_ˆGy·ÒDÜ'M½EíÙ­ŽfÍM •#‰Y ü úNWÂØ:Éh;lz(J–§¸ORb#ÒÈž(Ø×T&=I‘2X*Eö&Jßø1âHìN"|²É¦¦š Ó§‘4J‚cݾB\ÂoG),gt#ÂnœGnIa”II:N ó'iÔ'¬„%ô¢dHÅe„˜ÐJ‹ ™ =†BJ£M¸Ú ¼€4ÐÞ#ö¡YT~»Ñ_'3NꨫHötogl}[Þ”Ú¡­f1Œ0ȧË쀚®h¡{„-ëTzóUUU3 )$’¥)Jh”Rd2’ʪmlõj’ Ñ'x®¢ †ðNjBØC @KÞT"‡rª Â3ÓÝôA€œKÄBù'· L{ÔÑ©"LÆI1T¥iZZ¥u»¢"JJR¥+)IIDIIDDD”Ê€ˆŒRR•)Y)JJ"J™ÚZȵ©µi[kF‹TªŠ @¨- ªUUlÛY5­d€ )@’” )@$¥¬ªÑmQmDRDD”¥E$”DDDDRM«0DDIJTDDDDD”¥DDDDDIJTDDDDD”¥DDDDDD”¥DIJTDDDDDDDFÖ"JR¢""""$¥*"""#kHSTTPDg‚$Ê'ø·ÕØ;½·¡–„²Ô²“ ’•Ÿ‘ûÅ €ÇHÀg¼d$=¼ƒä¢À ùÀúuTÂ1ÐSÒy†;Aêœ!Ó*ªª""")Jl³33ÌÌòÒk3œQOP™ë·[3+Ëo~Þf™™†fÀAS3Z¨¨„‰÷©Š¤Ó*?’Qæõ ¾¨ þ;)H¬¾m1ö÷§D)½xÀEô½h:wb!©Yno_ZØ•Y™Q(@ìî§ÛZ¼–Ó@¡ÔHˆFeØ=g¯Ãæ6&XDÜ$׳UóÝÛ©7N›¦¹[–Å„1°JJNp˜‡¸–'k$ça9U›*ÁhÖ5…1‰X€…,eX(PØ©¦Å`›"6š6À,xe¬6˜ÀV çŠ Fµº(T±_Æ¡NÈF¡ÁìÄ""P‹*¼ /žçpÁÁW ZA¢ ;áêíÄÓÁž=¡7n-H}0E( /˜„=ÿ‹ó~o—õä’I$“{­ï{Þä’Mˆô>a^À„™ÇqÆffa†a™™™™™™™™™˜ÛxfffffffOË­kZÌÌÌ0à 000003333333333o330ÌÌÌÌÍLÌëU.I$’B„! I$’I$’I$’I$“32J’I$“ã° ¡!Þ÷½É$’I$’I$’jI#mæffa†±bÅ™™™™™™™™™˜Ûxfffffffffcmæffa†±bÅ™™™™™™™™™˜Ûy™™†fffffff‰$’I$’IB„QEQI$’I$’I$’I$“32J’I$’I$™™™$’„! EQI$’I$’I$’LÌÉ*I$’I$’ffIRI$’I$’I$’IB„ @$’I$’I$’I33$©$’I$’I™™%I&ffBI'¹å£§Âözû]¶§Ö'² …D‰:êäDt‚|¢Ê8>ß”CJ$~k:¤ú©ee#òû¤ïâå'«=j žJCåÓ‘µv££iÅZÏ5_£ßîHR ’R”²’II 2„@’R”²’IIJPBHµfÛkR«*´j¥R«Iµ­EV‹Yµ¡VÒ@R€B@” IJ” IJ%(R€°IJ”  X$$$í­ùkZ¼£°[‘@£­`ª¼ÀzóÛ|~—Ë÷{íiKÛp@•öTw$ÁCTP!¯Êà aöâ8N6aƒ©R Æa†aЋè,Ô)†(B«11$ÅLHSM±6.>„xê Žô Š/Aø,(iiQ0„ÁmEµ¯U¾>+Ãðô$¥5¡VÛ-ª¶y·ÞnüyiêžíªB|‡Gu1GØN¡G¨Âè¢h„N]éêü{WÅÕZø¶¾ŸQ%)­O{Çe ÁæièP¡®áàQÚ)b ‚¡T$ºøȳ|ÅÁ»NìW•€QåÐf¹-ÇBs|èyœœäŇP@M' À¦î).6ØͶջm–Í?F‚R!%ï6êß?¨’”Ѫ ÂFùÞõ¯¥Ý­ï77ÒúÞÿJSF¨ƒ T )M 0”¥P{Ûo¦Þô ¨rtÐõ8ÇY‚¹(ìÌM;¾RÚïVו¾>BJSF¨ƒ ¶¾/”4DZ–Ò¨­|•Z×"KÛÐ’”Ѫ ÂFö¶ÛkªíL”Ú•@’”Ñjnª·Âö¸Ê\ò«…-hU —„jà¯zÐÚ8ǃž‚ } w*  žÆAó64%ì`ç‘ÇÆÑcÇ):4ÃÉ%ÈnKï‘«i4Öó§·üݱ=Äü:’@*‚¸-i+J¸Í#= z1¦mŒA¥ìû(+;!‚¥u@w€° LÊ5sV› - -)HJ:'$©·b#܈ K Â6”­”ÒT«¦¬™™™YXBT”dBRVBB)iSU›KMñ§u¶ÞkÏm¯Ôµ¯¿oc!žnOÁ5RDÞI:Rµ¤Vò ìßáEmQ}Œ-•J,†~²ÊX‰û”jHÜ|dî0îăñìù·_kŠ¨ 3ªªªªª«ZäA߈Äö`°Dšz7êN’H‰”O‘2a|R9 ‹I„£{J¥XZ’¨¥-¶—€qî›Äa,àd¯q}0[µÁ0OØ ªëI ŽÒÀÕ'Z« îòFCD´ÐÄý `±cöÔµlª”ºˆ¬˜"ƒ¯~.­Ûó¦’B‘™‚V‘¥hªdgz5a­o*«0Œè%Þpïê +0AåP>àñîÛy£s'8‚DD‘"O<¶Ý¼•m¶õ‰ÐòNé¶AäéÞ^““Ï7IÛgyå¶ÛÚÔùH‰ðT>’RuÑ"MPwqµFDHDö‡–zÕi1zCbf%›5¤ÔÓ ‰† „Á²´_  äëEÛ_ÚMf—11–g$¥c–¶»VJ@0Â’Y$[)2Y,™"„€!Pš…6µ)[l–JH6KWÎÕR©î}ààò ^¸Ø:]ÊïNx˜&rp21qS c(É’Ìe-Za¶&šMç¤%%˜ˆÀÁê’SzKdFo|cžž4’'a³cg ´ ¶Ûˆö˜Úíð—dêÎ]*téÓ¿'Z!; H¾^ÿw¶õùJP ¥PI )@*•AÚ½þ>9ßfýMZtNÀNÒsÏ;·'JK’á0Rg¬>oÇ‚"'îJ¢ûØ’Tcä*IgÇãÕòj«å¦—ãå[åù¤µ IëXBj²¦³ 4Æ‹ñÛlVÙZ0Õ˜2†@\ã„d&ùÓB6©|‰zíÁ8 ›ì˜N¸’ÝèßdÙ-KKÑËá­q­ÛµV®.ôo˜Õ$Ö‡CCAa³kppj(°¸GˆJ¢·67i¦í774¥R°­Ñ0JQ)B›†æš7RŠ`¦æé³[4«4ÖšVs;:óäˆE„XßÚ4^Å ƒ(¡1±”mü):+¢Ô UX*JÑ;P=íɲƒ†0DX@eQD”h„$[D  hPû¿}tò%;“uò‰Q0îwém¹™m¹ŒUUc )JSfL,ÉÇœq±±Æg3*±z”GÀ‹± ÜÕxT)@GÞ«îò&‰á¡6à ]‰¸'Q Z¤‘1ìÎ-ë|¸Ý’-'¼ÍIN`“vк0¬‰ EéÀq±Îlº‹7£±³Dõ¬*«¢ $†ˆ…UQb¥Hª¥BLEA9@÷v0HšDI´c¥éš3®Òõ‘f,§*¢“!Ó–î\ä¼ltb53A´FDìs'JݵZ©Ç Ó3+ZÖ4ä°|H¼NdV$eDŽ6Oaáœ:ÙÛ4Uº7Ë’tDà‘ ¦º Å#ls‹»U´ŠV®-:TÑJ22–€4 ƒNRD¤oZ ¤£ÀÐM¶JÄèé3L«U®‡,—jÖ,ÂZP(Lle*¶&cG¸„ú_›$’L¢e$DeiA”U»—c³dÓ+kZ+ò­¸¤i‡$‰DP¸ÁBEU ]FÖ.²I}u&"¢¦Q”»¡SÀö‚°È4 H#ÖÖS’I%A ¨r`EÁ[¥Oû¿ñøÁäO$qö¤“ã|ÐŽÐ~¹"ÈSÒ¢h}/˜ ¿‡¼U<ÁùPèE]HÁ=ÄЙDGHûâÅ‹iK SM•oÅmªòòJªªª«h ºGÃÐGP‡xìºÄÑ)¸iY¤üǃ<Y,èûј2<åGÒ¢F Hxfd_@‰£Ï¢¢=è‡< BX‘Q'„­nM„$ûÉ“”ÛøÐtÔÀŒÌ’E‘(b)$˜±ïɤÒ@ÊD£¸HéÓ¢4c_‘DØM¶MìKEP¥’ðTÑ); ´I;ŽÒHMˆ¿8¡ÛJœÇ^Ú4DuË##$+"ÑjKVÃB$©ãÙßé'î¶AÏöæ6‡ò›ÿì UÉ=2B °‚ðôÁ?ð5nµ$å»$OR“ õ½¯¼#'iñ¿²’ I"€a 2cH¬{X›<ÞD‰¿C':y  ¯èþÞ—ßH ]µpª¢®ÅxîHâÎ3P¼‹;Åÿ=ñjW½ï{Ö¸«|UUa…ÂTµ¯‡,DRq»«ãŽMró>K9°G/`Ê”„<]œáãnåõˆÁ®3œÄþþsÕ–Zƒz£¶ë¼n¢ÝU jÙcÀEM(Ea±×[@ÈU#«ººxmŽó@Bãˆé-é׫X½«“#3 Áã¼úÉñçw÷«É…<تbªŸŸâúߺ ÿh¤ÌTI¢?¤%.:ÁæõæMúÄ?«ï_³ïý}½.‡¹UPeŽÄoòXÙa.¥u+¶š×8×wÝÅÝÍÎÛ‚!·S £ŽòÃö~kûÍ~)h[䬹N 'Ž§#,µ pò;:G-Ò ð¿ÁÀ(s¾Î`!(Ñ­ЪÊk0GÐu»éã–Í–‹cVOsj´ª*DRT¤DDDDAEQE¡AÎÂÂ&ØQòB‰)CT„’{ÓW )-°U[UW+žºØ7Dð‘å¿g_áïÅ[jÙ¦¢»Ä#M‘¼úœE*–w"•K:‹J0j¥‰«(νS¡˜ÁpDÕ0v¬‡Ü.¢¹\ì„ÿ2­²h#²KªiÀRÑœ#ŠœÒ·Cñk,Ï?Bë×F_kã‡}ëF/›u¼‹fpKfÛº¬Šó¬Sá·š-mn¦Z÷!¦÷ÑÛvƒTóxV¨C` 1ƒV¡º¦Jojš*™)•4U2S|TÑTÉL©¢©’ˆ°‰@OA= P¡,µ"ªE³° §Çvܯh‘0…_„ì]^àÖw÷ZКÍYª« Ff²ªÍj6ª‡’h@çÇÖ‡@×€–ÛÍ™˜``a.-¶ë=Üã®’9ð-¶W'ÂCU{Ú×åß9÷ )]ÕKrÜC©¸IM4@!򦐤ۮ - ,©E–…–)K*b©š¥+¯«m_“ð°$¥_l»(µ’„5×ßWæöj­ï}à$’I)JR”¥ ©µ(3 ¤eßH=ŸG[áä×50Y=ÒèÑ<ãB' ¦n½¹EO_½U=(§^¥âÕ‘¤Æ˜úùó¿[ÈN}^œg<ÚG„L;†‘ÞhÿñçZ¿·á££©é­4-ÒCoåm¶êª§Çã²Mï;~ñzÐCÌ6¾”öõDA%Im¥WÛkªà’š5HI'[J¸$¦R {’Q!PîÐ!ŽÝ'my²æJÄ3g8ÊD”7©âá»t­´1Ê[Ò²òN '¬e’UpZ$:ÛÂòˆq½W…6š#  ³º“]ø<,ÞfUœD;ebÄ,¦Êݾ¶ª„Q@ µ*¹R\VðPŸV¼Õ·ª®÷SšžÊR:E””Ã¥—‰U¸„‘ỜÕö )@ PIJ$·5¶Ø¶±VÚ”„›bÅ-â ôø¤Y?&©šê¥«UUUUéUUUURı+ŠÅb±X¬V˜Y…ÝMÔÝMÔÝMÔÜç9Îsœêªªªªªªªªªªªªªªªªªªª«ÒÛjªªªªªªªªªº½ù:tšqžlõÐL3­hMƒò|Zê#°nÛ9jCMóÕÛ7ƒDóxV´LÁ—W˜‡Û‹.ÊI ÀwªOPÓk–hµ¨9J cn0®;ÕnQT^Ë×5:F„ ˜]ëßUš¦²±“.Nߺö²Š5çà·ÜSÓ…˜cð¬ò˜J ¢€ð×WoÅëåè@*Á 2¤© ¥IÔȘÊO 8y6ïÍLà`S5 5 ïÙîòóï<ïD¯yB Ô´ARb0fÞ&ÒM6†N´jyõS YÑdÆ3/ ¿˜Êz¼/Ó[Çw| Ž…dÉN""4ˆãê*êú±9¼Fœùi²á‘¼T±{Æ%´Æ3KMÄlÏH×…)nÈåcÝ$}¼Bpå±Í÷ ш}òD–ß²ªªªªªôåUUUUU\V+ŠÅb±X¬V+ŠÄÝMÔÝMÔÝMÔÝMÔÝMÔ¼’÷·5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUé mµ UUUUU]šªªªªªßw÷û+ÚfUUUWÅâ#Ï@ÐŽœ ¯¼IJj‚JP!ÛkªÖ±kµе¨Z4‰ôD¡bȺ­¶ª”rVx{BLšƒ¼…ËjÕ\Ìš„ä5¸<úôÚvôg¤“F§0˜÷Õ«ÐHÐO£ÄéG¨d‘ó0Á5*Ëw¹ HQ€Yд鴈N“Ææ¶ú»ùÞ—.V+IJ$½zH«Ud¤!b¯z-§¨Ø¨F¬X‹g¦´Žz\ëW{úUM<‘dVEae99999|ï/“m¶t±‘Fd”«"áH¥)ßs–¸‡|c6–¦”ŽüADõƒm"ìw½âå!Ê”¼"–ïè“ !E«šù¼¤}Ÿ){äÒ±…÷á¦SŽHi½·vá¶hžo Ö‰˜Ía·j.4ês¹;6Þ“™,ºYVEx<Ì:–…rª§=i­Nq¨ÕW,hG…kŸzm¶ÛcÆ 4U²­¶Ûm¶Ûm¶Ûm¶ÛmáÅ}}ú‹BÁ6’âE‘¾†vOÈ4‘æ‘ÎçHjÚˆ ©¢*¢ø|Ï4DÎôˆ‹»¬Š+Öö¹r±X¦ÂÆ\°¹Ëœç79ÎîåÎZ¾,e™™¹ëÓFóVÙšH™ç )A º[Wk=‰–ªj¾¾ÞÀ¦€ R@vÄÁ À•]xrë‚Þ:Þ·.V+˜XË–,Œ²Ë',‹ ÈË'J|>îÇTA÷?;jÏÉ{Mµ¾_0$’I%)™™™˜I$’R™™™™€I$’I™™™™™˜I$’I&e)™™™˜Xi ý§ËÁ/¶·ijJä‘Uåè¸Ðûz©$ïÅß'-žDp„÷î8î |{úJ>ƒÖ"D—¢¬’( ÔªiÛkÝ'ÃðÛæð""D‰ЀôõK;y|ª±,K"K"KÑVtŠªª²R UW½ù'ÖK&§^‚9Ò”SC䇅DA*ˆ=~7ÉÎsœç9Îmsªªªªª¬Kı,KijŠÅb±faL)…˜Yƒu7Su7Su7Sœç9ÎsUUUUUUUUUUUUUè×UUUUUUUUUUUYÉÖruUUUUUUUUUË,²ËgÜiVçQÜpRÒˆ‹)!ÊÅjÝ>[ðÿ“•mœÿÆò•3{ײ”Çu¶ßm££Û–ö·.¢sßÃ:ñ¾åtãcáÆöxtÕí¶×v¶1³4ۭLJܸÆ@­ÍåÍÑ£9[KoÍÛãäåzhå§=N×jò‘«ézlËÙ¾›m¥xp}:g<¦[—Nù㽑"oŸæ±TLBÿZY¶ÍˆÍŽ«X-{2’‰º¹ºÐ¥¡ö¡"uý}Ʀ©v.£mÍÑ“ƒ ¦ ÞbDòƒÃhϧm7Û3ˆ±ñ4°õKkÆ:#Çèõž—óG¡—C&èÖ h‡¿ È“ÙÑÑÑ&©È¯AŒh••h¡‘1…¹·HW<Ý 6ÅEl2öî.JSQ1Rgîñð)G“]†6à|˜èâÛmW„w‘G©å->WLr²Ê¨®S ÄÔâö­&ꨉs¯]òò<@áˆÚí?;øžº1…еà9n6g„Z"ã¬7ÔáêaxÍ[m1ß`8…c:ÄéüÿóøèæÿÔá¶Ý#ÓÖC ¸¾tù#Þ8ñ¶Ô‘s» M «#áD‘pVG§òyÏ~!©Èæ©Jmû9åßçߦr]è¼ù’† ‹ ãò‹­c--@Ã@S ±¸DCi¶ÈM@Ê ‹ñŸoÁǧãꂉüŸTÉ£ê£CÆ ¹}F~À ü¿zâiYWI_ï–¦ †8µ-¬‹“toËi,›zÙgwg8páÇ'y\žššF²“"¼¿pá»Û Þ÷²-Ô’;ãÅù»¿½û×}óÑãÞZ–Ón—§JÁdôèäjËRUØv cÆ1Œgpx¼€L/7“ÓòµL#çr™i¢r 3Öî|Þ­q)JY)šef‰|©|Í{u ×8_¸¨-¥¦ÒS“×ÁÜ& …XÙõ¢hÔý"{þßïæù*ª­æþà¼s÷>`!ùnÆ­$‹Öÿ.%´±ýÿøD<Æ«üAÐÐ~l’IrnW‘xˆi!rö²^=GDjС©ÉÖ°5(º…ÈUæ(¢Š(¢Š(Òë‹ày^[E6cd£5ƒâO¼^¼áì#£8ºÃ°'0`Ê"ý1D9“qäŧ£¯ÊË€“»UUUUUŸ{}³Þ|;X¾þønžM%ô¥¦ªç7©ÕÇ~Ç{Û{%±nU—¶pQák~ãÓ(CýÖ®±š4a'áfB¸…`Û5¨"3 ‰‘m€•‘I`"•`™! *Aa„:’(% 1C"fd‰L vÇåòØçDzklôüHþtxËëd¤ =Œ0ž¿ Ûñk<8ÞéË%-âäd ’¦‹DG„£…Û2‡À3_ÝS¬ˆ ÁË¡;iîd7U1TUiÞí~[Ø”„M,O7Óͯf2bR¤Ú)Z I±iL´ÔÂ4¢Êˆº¾¯qzѦ‘A‘¥ðühñ´ôQÁ*>oU*«Ô¬+•òp2LÌŒ¤t&‰`ÊŸ0øâ´qø!p_‘n6…9컚ñÀr:œpÊÝ(V÷/z &ûz½ª…Û|ºúD£&¾DhÌTËoVÀ$žŸ‰<Á”$¢?ââ/ù•>~/0< ‚ýù„>*Y¤±^èCôˆ{o¬§ÐD”¥¶ôø¥¯¥öæ¼ý æ"ø€üª/±¨¶Ø’cʘE"–YRF´{ÇýÚ7}“õ,96Ã#|?çÔýmh‰mw⩱@tQšÚ!†‚sØ”ªØ¯V’gÜ7¨² ÝQââálwÞ‰96t“W5¼# 5HVŒVÁ}!Ä8 Ã}NC—ÝÄ?Ž“à€ìòIõΓ¤\eo1’Êš2ÃS:7±ÙfP19`æ´àNïa# †lwÒ4#’øÃ¥19 Ñ6™9ÈýÁÿ÷ÿçðÉÿï™m²ƒý÷þÞ¿ü¿ïب~Bý¥?ã"/øѺ>ù"!J‘!,Ad€b`û!!÷¬“ô~âÏ™)4 ‰>¯Ds™1ö~ÌYeëšÞÌI°~%ÁF P¨+X–@Ÿu~ÜŒ’A,hcèE„ˆãÐå7žV8²D–Œ¡¤ƒ£ °(R ËlÁD(Oñ¤‚˜H Ë¡°N{ý}GÖ;ÐÜÙ0éI1û»íël‹V!¢$åω{#Ör@ýK =xDÛÝ߃\®ÃÔuG´'å•0P? 3wIcOÞhâA).’m¾‘Âuƒð‘â߆¸A7›SzÅ2PDô‚K² BˆŸ°Êþ!àTS¼ƒòœ˜•†=@¾ÓÉàV€ä×k% 8Á‚Ie˜E"…$ˆ´Ä²$$!hÇ<‰ vh Ldv3·…{ .ê)‚ìB_²'› %+þ÷Áïì)â¨z *H«)*FàO7.b½ÙJ L´$àb ˜&$Aˆ]6ìª&k˜Ú4º•©>ÚXõÈ}'z—0jŒB> Ö¢Äú##0Äô¢¦j ©ñÒ—XD™ x¢jýÏmµ˜¢›>SB[L~Ó³§öBÄFCQ¤ÆE{ñ;wÐÊ…¬ P„4¬JA ’"ñÓÈå=V:p5šiBÕ¦ÍéÕ=µ*å%e5ŒÅ&ªeÚ˜Øw“dŸåK‚Á).O…f"üýP=‡ÆÃk‚J’h ¯r¨–¾‘^Ã"Ýý̘-QW·4•yíØN³h‘ŠvGdâN;“ÃÊ¢gGJã $tkÉ£½Iw–©Dxdè×µêA (p4ÄëL S?õ $€gÌ°x6&VP±WôhvtÅíÉ£{m]ƒ.¼`\oœG(iÉy€Èpõ‚-€ÊuWœCH?Z{Ogt’ë'ÎNÒIH’¢vû;GÌ–$ ¨FX)ûx‡ üb¯;d’g¬8¯‘*Pß6š11ü0£œ i Løÿ@þQ}úÒ+øõüÿéÁÔHþ¯Ú…ûŽ‹ÎzÁ#ô¡Lì|È_(š\þ89ˆ¥~J{m>”||¦™¾J!úàæ@>»’É"ˆÿ(ÿj~Q%9œÅМħöÓ÷Ò)sýŒÑ=¬µb´IX˜È’… ­+%¶X®(û ö‡)Ù¤÷£œ7³(:È¢šAÞªs(Ò‚9¹ ëð‰S'M{‘öç!#åìG&0Te¤afPýÁœ"YcÒNBÒËGÇê©Ï& ™‚¤] —iD¡4`èDòÀï”ÒsJªÐQ@Ï·í(€Šý}p~hE{'ÕûSš)‹–H%„“JîžÃñ#úVý±>¼ðdÑš¥Ôi¥f¤µÊÒéÁ}~ÎB™;»w/‰˜Ô3ÒUžíZÍmè‚p'˜Á˜ }Š0~{!Ö_w©*=HsÙ4ïÂ)m= ŒïSE"L…„å`Vª¼lm£VÝM¹¹ª+¨IlM¶†¥KR¡l4¢ãÜ"‚HH¯ô°#Dšˆÿ‰æáoúœ½;ñߎҕ<-]}ôÕÚÜþÙòx÷µ·áåù;V¼ùò®Áx¸’¯,cm+9ñÊáÃ]Í°—.SœÐùWm¹óÜœë#\äDš.&KœÎLhP™Àè`Á¹ B^²³kZü-»¥%%%#h‘ÕVÊü¿”˜À ʈýätŠØù?àj4÷FÒ×À±¨ê†Â ;ûçìûÐò°]¬iPÐ Ý/Sdo¦$H­˜!ú+L«I¤ @CH¡/ ÂÞ¯ïù'ýó“þ'ÿÏÿÉŽ'?ù|Õ¥c·áAšw8ÀqÉ£{1&A€`H-*¡Q×IDOR0û%Î>Ãë6!¡7õ¼¨áÜIú03ür©õ"«0°«Ì –@WUJY5c$ÕÆ2´eVF ƒu7Žk “”;–à 7¼Ã`–j-k@PŒ Hf uívý¸’RöÖ™n§hÑ· ª¤±¸ÒG_Ý¿ù®?GŽä㨪$,˜!y|‚x}WЋëW¨è•ø” GVo¼ídE*i¿Ávõkwveð­®ÔWŒoΈá6ýëláÎÚh#Rž!¡1êd .fõ )°éÒl3!L“W´Íâ§^u…€oV]tmA4:5*Å’awˆÑJë© Ž›6h’†„±V¾Øl1†@‡[˜Y Òȹ.âpöñÂFø€°Þù°›D¶f)µÄÙ.°$ÀÞ&õ‚EAjr 0²¶¥ê@`:Òc fbÑX®ù¼€±C µ(0?=Ù»²*_ X™Ö6$À‹°$unN²€l‡ â0\6oZÙ:‡Tµ³©«šÝ-–&̶å”&‹rjÙ¹DÄÒàkXè30©2ªí€ÁX˦Ê#Ubb@àX®X¦XÉ–™ŠÑAiXJI Ô/‹‡ Ðw¡Eð9èa"0h5¤é;Û¨À¬®1o5†B³&ƒ@ÌqÁ48:˜JªTÐȨ™3& Lf$ÊK©RDRäÌ’A(ÓNÜ@*—™Þù BÊÖµÁ  €il[ÂËÓZ‘4hÄA<ÞÃÎC¤ˆ±Rð?\¤üfä "È£ ª•Á`{J> ÜÒ{§jŸß*Ih«îTméä`*wÉâ¬y›CÕA&½Ú±Ã¢1Öq E€6Ä^-I@ÊÝÐdr Âz2ªwë›|¶cvÎxâ{ñx—$ðO”E°°Ûþ±Ž$Z¼Adê&¯ G`õy"?”OúútMOae]C¡ê?§(¢3ÙHRJ»ïGWäƒ@ogC㦩„Y¥ú Ûa*íñjÔm™&#ƒx#ÓÒ ƒÜ©+ð )Œ K펤‡OcØD¿|#aÀ¾Jð9>¤oöBË= Ëß Ö„XkÎËÉhGµ3¯ì ¹BzÉ À¡‚™¢mÊ7¦“,7ººéëœQL39Œþ%%Ç÷iR¤ämÊÈØ"svýqžÙ±£<óÌ<à*=•XCkAëƒÝ ÂAt= xôË ¨É“§†%¨Äc†²AVÚ.R¥NcW¾P6+¼,Â[aD°KhÙ6^4œKŒÛÎEÆ Am“¢8¯`€ò$RÅΗ”P€›Akf+ M2 S«7ª­' "È٠«…­Ö´:èq»ƒ™ËÜN®,‰’‘긮±Û´dh:Ó¢¶ŠâÛzdÊë+Dó:š«Ž:™ØËËX‚rYêÄè Û·`ï é8‡¦á4§R¡RÀT°Àf.™’ÀT°Àf.`Ád°²QEK %J3$Á˜0Y,,”QE’ÂÉE’ŒÉ0f K %P%–X ÅÀ3À%™EY,,”Y(Ì“`À–BX d%€–1p3 %…’Š(²XY(²Q™& Á‚Éad¢Š,–J,”fIƒ0`²XY(¢,„°Àf.˜,„Ê(¢Éad¢ÉFd˜3²À@@K!,°‹˜2%B¤¨f …’ŒÁˆK˜,²ÀK9SeM•6UÝWTÙ©²¤”Y(²Q˜2ƒ!˜2E’S0 X `%€–X `%€–BX À0Ie3Äf E’¢ÉBÉ`Ì Áf+€ÈK˜!™’Âfd´3 %J,–% %J2`À²X,”,”3C0d3 %J,”Y(±€–BX `%€–X ÀÈfI0,–J3C0d3Ä3Ä3Àe”–S3%„Ì–X d!` e%€–W%–0 BX Á²Q˜2J3 %K %ƒ!d£3,•ƒ’X d!` `%€–S#0d3C,†-’ÂÉaVBY d%–Y d%–BY Ã%„–XIe3 –S0Éd3 –C0Ée3 –S0Ée3 –S0Ée3 –S0Ée3 –S0Ée3 –C0ÉÍ\Ý5#f¤lÔš‘³R6jFÍHÙ©5#f¤lÔ–›-6Zl´YIa"–Y a%„ŠVÓeHÙ©5#eM•3,°ÀK,°ªl©³RM•6TÙSeM•6TÙSeM•6TÙQ`$$%–X `%€¶TÙSeM•6TÙ©&Ê‘³R6jFÍM•)¦É%„–XH¥„–Y j<\U’¢Ê!TNâ]b³ûn§C:o¤ƒHÌçT±6³ÝkÆÞzw›˜YKä!–öœ^í²n#`)vîà³,Ðlïå”æÚBÒ½*L%9yÙ®Ý0x¶sH‘äÁ9qL=ÉJ‹F„ö™Á‡™ï`&dÜ8£“ï„7QòRÛWµÁ‹4{sj²I&¤P8ÄÞ ñŠfÞt"y6#ÝÛpeqC¼Á|‘É71 Ž lº†ôØw­:ž«P9yÞ.kAÝ ¸ÉDñïº3žœvx^ÚäÉ;ÜÍKعP€Y.ä„œíP•*'ªäTÉãŽìÕÒ+Üà!¡†’…vN·qfpá•´‰ÒsÉÂù'Ëue,Öe·Ž¤MšÎÜíÍí -Ë:Ä;Åcv%<½äT*‘5$hMD¹O9¢ b°Î•VõÀÝãd@üë¹òztŠŠlóA˜v¼ÚKºS^•¾ ¹Í!phw¤ÅËNŽ’b¨hø 9雚;rZSNk•7àÑd§CyÃ)S0Må«„ÇP{ËTiPW@•xH$å„"ÓDƒÀâdË7a¡°¢ÔLÆ&‡¶˜óÐ/t¾ªx7†ôþ/|m/ <ÓÍŽMîäˆÂ×9§O'J$\®` Û»Þ#Èí.)&k—Ç‹Az.Fó£ŽùÛ¾ºJ<ï©vpàN›»¶a01(U;¬É¢ÈT®¹Y`g I’oÀuPiÒ=1ž7²í¶0jû_@¢ÙI5PL™ ÒB™ZΠ'X„ªåHŽk‡}¹o1—Èu,*XÔ%zJãS¼b´:÷#É®ÿFp’¢ ÃR4L)MŠ"Ç``8;8´‘Ћ¯ÆþIÝëZÇ$ç¸è‡Z•.§y›*GZ©p¾ƒ¦p¶¢÷10Æ‘.&BQE~8©!Kl§™:ÆNÓ#1ži¦ð5À$/<´uy4L妊Tích<§²…ÚÁkžŽˆMÍ—¿^*šP°V’➧–vÞ1"õ'Fš…Ðȉ9"F$eVŠ'J ¤v-–KÆ”ce¦fRB‹d&v!_ভyxä!MÊöÖ„I^¤!Ò+/äÑόʳiˆõÆ-«6.®¸Ìz¨ÖbvÈ:Ú»õ4ÒO}æwÁ½d.ì=K°"éÎ7âj¶ Òï¯\] $¹¢  îÂu|U“"ug;[ÅÇVPP¬ÅÏb¼ô¥¥[h*+ip¯¿@BV *2ùh3k°Fv´aAè Ë\·uÖFvÈXTÆó0 b{¼$¤Õ„]RYê6äß~ :Nð‡»dÝ:—´sª}MqŽ…¦¯¡S¤X•{Õú…–Š¡ ÑßoÇTW”Îê>µce‚IZ,,ÖU×£” Í‚y †IÉ-Vbmh~lŠ“»8›WÆjƒŠŠOÚŒH"/Ç|•ßXÔÂÖ·Zdelõ¸†Óê|2Ø´ŽØÆVøçlëº2ß|àq¨A5æðŽý}²êéW v¾ScšxwYè›`P°ßU‚9ƒz6ì, ÍÔXõ;àúÕuSžVé^5‚¬_ùä%Ý0ï î…Ö‘’êÎ3Á£ªDZª9YZó –q=Uµp­@{V’`•¹@h¤QE›hi¯]Ùwe¾ÞWÝñ—Xl§TmX^úÁ!!<ÓH¯—•¬îú}mg‹ oMaÀ¬(ksÃò]'ùuu‚þ_Û¯·àX)iü°ü²?rhÆÂeÿ$NßKìƒÐâÇȈäAÝ6Gw-SVû/ ™ºSMR–C‹"IV½KDdŒvµr^×îªæ;rN{ðìÜá"N\Ó»QøÉ0?ÒR¡C ,&BR8 H€S ÐR‡ˆì#Ñ_ôÄSo-·zÃíK-±|?‡qÌE 2 Ä!ýýHŽP©"G¿Ô¬“°‡QÐI6O‰{qôy °Å4Á1`àcZ!7¬H @Á„©¼\&—K!¦¦¶³NìiZ?üäËgŽ«×d e'jõJÞÁ*DÁò„˜f ú¯è­˜Ÿäªª‹£õ;DÐGFÙø#ç3åãhF—JhC;« ƒ´¹ûKÈ#< .WZÕHU&Œ*–Qf ‰Yp Ô(>Áà>þw‰¯SÅøß{Ì»ðz 7BpÜðKI]:ƒG^éòN ‘´Íøï1´¦ï¯9ÓÍ©:Í·Æ •p]R(KÌ[(€Š°TUV 6ª¨ðË©\µæ¨J¯'w9–– %©ŠJL4wóïu¡KXN"™nŽoißw¦‹8!ØŽ/rÑzðs„ñ&^ØíãYÅK¬ ½{3…¬°t/ „¸æ`/†»~’ÖmiÙ•)ÃÃE¦uÊ謵’R0TY[‘w)Ü:ËÖÑÞÁšßV¾ÜìçcÛ=uÚQËù«+(ÌÕ!ÛBEÆhV@„£eÊ›ÎN±®xŽEÕ`ÓJKi(\) nª@=«w+­Û²î×8è­Ne#~õjß” ô¬šnn0l¥•Æ@‘e9¤@AÍÙ”j»ª*®ÖŽÇ®±ƒ;µg}ÍMNÜbHDü>¥à~VY>œS’<# ‡ºa_??3'£¹=nÖqˆcw’Is.H¾±:¢/pxÇÒ¤{,…’!T’O’¡ ‘+ì_fƒB}°=j}Ìò€ BU˜«óPü%,‹W­{=æñ÷ q$ r‘P‚ 0‚Ã(²³aV[m[SVšÕQE$A´ÒV*-e f̶¶´Zl“BÉô÷:VS`t WÞy)¡P7ÜûÆh4¢ÚŽ‘ä¶Äö@’tG2rù¤RЩP²YÑÃhÖÊc¸íEAdú8táw@—Ê¿"bbÕþLE¾²>XC>¹ŸzÙ~T,ŠxlH†#Ü/s Óð2Ì‘ö$)¤}ÚΘ´Åkó+‹ßeŽõ¤ÅˆÒ¸!Ð ê»EP«.¬MÄ®˜°pܘ † ¤ bš@¥!]ïk­F 'l òÃÿî þËÒ å!%DI"ÿ¿ˆÄR,U‘1cçî‘Ñö‘'¶‡ƒ!›ÅÄds@*ÁHkæ,%åG çcšT€æ£û}0¡ "ù<{~Eò_¶„Hl;vO®ó*>èÊz  f\‚iÛ[IÆ÷®‹ !-‚Æ]iof°vDRJ¬V!s¼Y p*„ EŒT º“E$¢Sø :¯'Y°Î ýþ‰‰/w3pûØîž—#ðÌCmáæ›H¦ÂÈ-‘Õˆ`šEº5¸rõúÊPT…äëV°›œ;€x0ö(FA†eðp°ëZW6u߬êØ+m.IfäR:ïQZ2°2‰B% Eƒ-É„ËU‘nfN«{κwß:GmtÐZŽÕ×Y³adRÆÑÚ&x¡^yê÷EUQ´QÖð².ºXÙ Ìé+hb’NLäçdÎ':6¼ÈZ[Ñkðñ°EÜÛÆŸ]Á€…ï)VÎb#V(7ÉÖéeÐYD¥Â¡$R €G¯³`àx©¯%tœ¡ »d#+³¬ÈÃ|ÕªŒœ—fÐwÁÁl •Á5ÆH®Lœ$Ì !âr^lìbsÊâlé,`ª•ÝÇzÑ 9í £•Ž ë%뮎½{8:MÙE¼ôÄË v.úâ¶]÷:皶0ê š¹¼Ð&n3z»\lØ\7G@å ¢Péd&vÐèì³Ff& 4Æ9Û:\òN1X«j‹,Á¢ó+¹ljôVén¯Vž-,P]wO'ø¡­ÇZ“6sooM×Îv®tÒÛmzçž.ÔÖ(›00^%Ôh©{óûgx‘gÆI´QÁן!×ÊHq€e)R¬•RžßD¨ÄqVQ:…YL@G%Â)‘&:€nÍ«À5­iWaŠèóïfª£ü]‚%"( ßÀÜõzt¢‹ ²FHYÄH¤•!WGÈš§¢ž*ƒ ¼<Ì{˜ßlÃÅÃM¤ƒ~ ‹–´U¦¹‚Ã6I«V²ð¦l݉ˆ 1n)¯¯­N‹ZRÝŸu”Úê©É&fÚ¼ªÍØ  yyypž½à„ ˜·â×tº¬íK¼îÜ“‹2Ì~8”!fnö¾1YAy»µKÌîÄ`½ ½èÚ[ ¿°–‡`„ ‘ãÌâº~¢å…Zô¡Ô×­q…{šg]ÙÊ‹Zmr¸‰ S‘È—R;)QlÝh“­+Äö.½öuK\]£uÒNΗ’ê· Ù¬²˜g )Lºòôb±»\”ƒ}àдR~,e4YíC§žY¥!UµÅ÷Õ¬ šZâw3ßßÕz>³^½ñì¢$óóÂ$³¼ò çÓ¼y}pHàOdúíi¥fʆZ¤µc+,²Ë54(‰ "3 àȉ¼I€¡¢ £‹Æ(‚@Ü×2F¾Ž¥+[4¯5Ù5j¤ ‚1CÇIId J¢fFªd Âï©š“»1ß<ÅÙÃØ|–T4°²yž{ •bt¿yF¥I,fè`Ï#ÒBû%Gm …1`à ‡Á(.Ù zõ¥@Hù§Ý«FdãƒB† ALdkr°‚’ + YR0$©—¡ëaïžIê‘h*ÄNÒºÄ ¤ß*öÚìAüÝ{“¿œSÃAPUæbáªDx"úª ˜ˆa@}Š‡£Í|üÔ Çß" RQ !ûžOoë­E’ߢ>I駉ࢉÞëG"àÈiNäïS@>±ö ¯Ì )è?ŽOŽ¿äøûÎkÄ„ËŸGNƒùá”îÛøòI$’I$’IQGWî¼øÝ]ÛÌÿÙÅkZjRûé"I9„‘¢å,̳2ÌË3 ^ü¡-pyXÕ8!"òƒ£Ó†2ICýLM]f22,m$C4øݵ…°¦a¬É5‚-’! ¬¨¤&ÉÈMÚpÁB%t™¦DH!'1D”%ÂE 0%ÈG01œÌq˜‡$“'S"®°º¯Œ1!Ö\†‚æG+ß–Â#y‹0E™ˆ¾ò,YÝztCúÚ‘1$úD~^ÐÜ‹û‘ð}*Ÿðd Ryp@ô:sæH"Æmdc&Ù©šWËMTÅ¥…–-lSBR0ˆHÓ˜â8Ž`*ÐSº]” P‡g¬VRm¶Û¬}lUUƒ  _F%*ŠAfñ<±E’Ïr!Å_QÉ"GÄããT^=«á{ÿB8‚§™*¼¸ªÃH¦”åRÅïðP^õcDGv"*"(}é>Ùûóh>»²‡‘!¬\II¦Ä?"å%”X>gd¾œ’wn‚È¡ :Ô 9Œ%JÞK„$NÕ(;PSÛ"+Þÿ$ßïô(/€>©_ýDiDà9~> ~ÙáòæFf9,ΈD~æÒÇ ÚuH)a˜šrs †Y ŒÖ±S™–³)Òeîí£·4ÑÛ–EY$#µÙ36ŠÓ³6Ü™üí¾šrœ·JûbR§ÜP—ªx˜F`ÿ!Þ‚PDŒ’ëœä„uâ%!ÔHÿ…Oⶈoz²~HxѼ¼äKIV*6”­ˆµF£LÖ¢ÚV¢)I…( D”–æá2¶M´j™¶¨*ZkM5‹RÑIšÕi©¥BD˜dJiD¥B%ˆÒ%¢Õ%X,[*Û%jÅ™ªVU&¶P±©[J¶ÁlV¶B ˆHi†jXaU¤†•b#Iª6‰5Ó,¦Ø¶ÐV1V´jДm6˜e2¢ÖŠÑQdà H°ˆ J­,Y¶%Œ’ÓSª ¨¤‰-H¨‘) "H4©-› ¢Åb±¦¶Ù´bÙe‹Rj5b[mš(Ë Òj”KLÕT¦° %züMÁS³°IÞꈣül×v¹g]ºä·-ÝÂ-&¥ºiªtFìѦ’ÇG] ˆÎ3˜¶b™o}pƒHÒ@)¤Lï ÉZ0±žÈÂv*gSS]@I Eíï6¢uê úAìïìS„; ȤÉ⓵ßLȪiHÓcDRÚ4ÉelkiI”TÒ”Ûc ƒ2°ÈŒ¬ M“ &–¡eeSf¬Åw¶G0Ž$¨•R~F|o³ÞbOíæIÊ*¸ˆ[_Ïi_`=(ƒ¸`¿Ä•Ë§ö.´)pæ ³°lÃ÷=å»,ŽV„LÝñ&Pc ­¤Ëê“þÙîT_3øß”½ v5•8,Ž,y «¯Ý8êð|FdoøK…WìûÁ+ǽó{¤ûi$¶ÜÛtèGy,iQzG’L#åò;{ÒC¿B$ȈQ,Dõ‘¹lýÍÏÝ=¡¢<|ºÓ0”„ÑWÒ²£2ÉÜ’nFxÒ‚úæ¤<~#®Ñ÷zÄ|£ÖéïBDôõCê”f‰NQ<}Ò“ ÓT¥;¯êí”±­[)"* ”D„R,“±] wÂe¦SÒ'úJù)(!üʳ $—C°wDÝ2è”Âe˜¡×LÕ’p€ñá'aA7ê¼Çë ’D‰ð6Ït/‘åîOçó €tyE1Ò0BPupX"€éS×é$a" —I-4ŠJ,- Ñ( ˆJĬˆB2Í‚L! JÈ¥E,RÊJHývd’„ <#îÐ4ÐE$“0Œ@„DÁO½q/˜}ÿ"ü| è²zÿ"bÉ.H‡šBO‰$çôüïÈsß?¢%5HÕ˜²ÓAˆ é3 ¥X·,`fa»1FÉ 0u3\Êd¾—ºPÉ$Iˆbd¤“ÂÉ ¦ÚI³Z!×o¬Îžmº1ͽt>¨¢€-¸ Ê`ˆ$;å[ë:²<0h¨üŠ²HÜMH’wŠ>¿gªæMâæbaJc5ªˆ"ÆF[X©5V„ªRäd¦—øx!0añ!^ù‘2i»ªªA±^Ìò»ìÁ±|á{5ñºÒ³)5ª<îI­Æøb¶Ê›ï©lÖRýŸ¦Šƒñ¬æœéßëêÇ Ús8è¨l°ÕÖ·¾…°ò„‡± I4\ då&@h"K{7šÑª0"T JˆnFܘ՚•´ˆ} áð‹'•Œbq1ª)BÛ–ÙØþŒÚåä ¯Ámc·­>ãê­;¤‡¿Aà"kÆ쨹#€“Å´]{NñãRuPO\ñ)²ÓQÖ41ø¸0„OÂ’ }p†–!ï0×íK¡³íQ+hù‘=ÇÝÆŸqÛiÇ9¥5ddÌÂ\\b€ì½Ý¨a„ǺC¢š] ¾¤Icaöa1-J²Ë(è9žíj`•4 : z£ÅÜ ò/Ûèmh‰6œj#<$ë+i´¬°Âs"u„˜a/úï²=Èð  C€Ì!ævì"{„qy~¨vºaÀó{>>wÂZ 5Ió±²Ie°Û0°{è=¥#ø9‘ê Ü—ÊuØ6ª«8) (%¯C?¹†`€!‘î;_®Î:>Äâ&ïc©öjIé’|¨† t»u­iÖZÃ’}ƒ;Ñnúì{ÌB­Ä5a–9ŠÇ€ýnè Pát”ܧFBuŠ"ÒÀ g2±uJ·rÅEŒtqI†ƒWLº×ôšÁicvÌGZÌĆ˜E‡VfpNˆ8²xÎ r'J]dS¥6èu¡ÒYs&ÂnŽ„3WpèQœ%Þd ›ÄÝŒˆ"Ì-ë¡WPèb±JÃÑšžœ8袩à“5‰y¤Œ¢›mrµÙ­“J„èÞÐ0æ`£L‡ñ™½£ÍI "{'ÁF_Pzù{ðÉQò‘€}©dD„{Üd'@õˆ¡lvO)=¢[ B‘Ë(Zdù bžÏ¿„Ú 1Õ†^â@CS¸Á0Q01‡E\DâE@*,ë‰lfÑ>v?0{èÉÍÃJ&‘XE¤ÔŠ™PÅ·*@Ä«³+WJæÚ¯ykEšÉ±FYQÄ„d#dI4 wH d‰I³r±"Ð%#D––µ2µaRV6²š¢¨­&ØØI¬‹I(ÁZm©°tˆb8Ž•2Q܉‚èd7<1H&ÕÉK  iOyÙhã0TØ(›R Ǒ꾿1ì‡ÊJ‡Æú<ÜSÖ2àf.¾¬>rWW®¥3åÎcöÉpcý$‚†Rž]2‚'ïÉ8u#Q@ã7ÃRh‰,N¦ù¥‡ ô !É# ªï1ræ €zÂœ*%¯F‘êGÊðM*¤ÚqÅy•¤#’£ÕzYæ=AWZ|À’!2NÿØ?,{yK©…~PØv!M/ò 0©J$„*¬„¨ÇyÕ~ëügš©û¢$®kÏ ”ëµåš®IX¼›T©ÚínY.njYXµ“‹‘…0Š’†ß£¸@S€ÚHB>®°2¥³ÄOÛ‘ù!EôÅi††iYi^ƒæ0yâTqR:'éO?Òæ}às23 “Ò@ÁîBÇTí õˆ¨z=iú³Ñuì(â)Jê Â~ ñîRE)ý  `éDþ >V„Q=2Š¾€^APû}¹™½)†/(šŠ!T(yÈH‘HIT}' …ÉTèIĨ&埆q ,"H0ªÆB-kWRÔ•ZÚ lÚ4Ð ÄBs"ü+Ð%A8‘:(|òÆ•(U0Cª}«›†¾ óÀŽÜxXäPè‘,¥A ÅO‹$÷< þxR•x(Ãä±;¢”„ID9…À)A”Zh £ZŒš¬jÐØš™LÆT 4E/ŸÎƒ û¾q^Á·ÅG‘}â´=Ì¿µ øÎxx Cú!X:uØõ©O`xCÒ Òب±2A5¥L2$õX@7ÇÛ8Þ "DŠÃAÍ~C òàûypHyÒy¢ø.âMœ†’r‚'´:·°06Pû²C« Â)§»¨;Ф²ï0˜D%îÖˆ"µ#ªjrD·lÜ…%.夞ÇaïÀÔ²MDI±)§:V+ šÊ÷¦Ÿšv`OE^©èGÑð—©•ó$t6X0 f:Å;AC[# (h!S`ò+ÀŸ<|CßöÑL°•š³r¡"³j|7’úVڽВ'é~H{é¹ñ°ÞWÒO²Gçˆ#ûQ<äº,DÊœuùõpóËê8Ñž¤÷w ³ PB<ŸõA­^œ˜¬HøÕ«RI9åMx³â„“*r€/uÚÉòO¡VOGÈûÖs'’iRÏ´ü=šMpmšÞt‰5¢ŸÌ‰åÌ@þéR=¹DÚŽÚO]„ƒé©O­0Ÿ u6±%²9˜>d>53#h‹ö:z"7A%ÓV+c£ãò_‹Ûç±~¹h…Rar`Ðlã LP4Ï·y·f!¥ t*E¸Ã[LÓ»„z1é¯n "J"(¢Š®ªiŽÇ–“â9"ÇØ!ÐCïð~´4¯±ä÷ÿÓdƒöBaÊ S7€w¸xUEUƃÕëñÄ: ¾°£ ü„‹î^¶‹%[Üâ;U½út6ïc.*#L!@¿4?jTŠ) _@©¶P?T<^IôŠ¡¥¦§ªõ9pžN_T0ýT.1}ÝÇ¢$Ôªž­VYG—×ïŠ)iUj¨È‘ψ‘¹„“ÁUbIŸt¼ À+!ÑÈ\¯ßŒ7TÚx™³5ÆõžXDœD‚7¨zÏpy„~íŒ$BP’ìQï:wm¢vX_?¡È0 x—Eè™$ÕB[ö°Éïû¿åk‡šBN(t‹ d@³ D“:¤¦<2õ@SN¨„ÚÃÀâ{'×ÔQr~ÐðVÛ)»¶Ý´Í2¨ÖeE±EUx¹O/º¦ü,ßMjïÌúÙ O«¥c…)uã 0ÄäP(A%„|QŽ¡43Ý:‡ ÷»¶l̘âÜ nPÆÌÂ"_7i(*$ŠE‘:s ÉB=,©ÐŽ*éÅ4U3L£Vúø1sŒ‘J&`¦.lIh cˆ‰Ò°99f`¨Ð£J‘™’ˆf9A9­9a0Ù¢tæÄ–k»µ¶ÞÇ(Ô˜°Ë ®¬a h À"&XbAg¦´é ÌBD-ZB¥¬Áˆ±"¥Ê»+ž-ÕãUÚÊ”QÒÑ«nL¦jEÖî›&A !¦1B’qÜ¢â#¶q(RF&ˆ€‚åÀrRA¢a‘Ll†É5Mk j’½«U®æiʸ–ÜnêJî.ÙeÝ$»„I¢f«®æ9‘¬È4(BA€˜‰³E›Û­Ù3iYe%jˆ &™8G "ªd5˜¹©#Et×­ö\ÑkP)’¥OŒªp”‘ÔƒCûNÊmí‰I¦Êk‚Æ']Í+MÔhŒ(ˆ˜¹ÛÁÐwÅZÊŽB˜²ª® ÖAÑÖ~³™'cè"Lâ¤ÙÓ›Dƒ¬$9¾äá2ˆ«y@{ÄH“PBI"@K±ðì~çp/AJ@(ô_¤pŒ !꬙CD1U@ÚÀîÐ8AÞÁ0"ï'@‹"tPèŠz4ò?¸GšH ¡I%" ÜöFÕú¿»û¿W»¿¡ ²P¢ÐÀ"Ç@X±bÆÿÈ×6‹ZÖ½ÙB… 0‹^º»’R|Q£JTAjÙV_+“Ñ3zr榳$ÔiqXÄRë$±Ý»j€kn1„ë'bšqÔàȆˆ04˜ˆ¸º€ÈÓ&`Ë3i±dƒHÆ,BUi„54k¤ÖÔa­þü"jDîeùñ~½b ÊîO’_„ùð=ò!|Ã(ŸbàÊ+óž‘_•©F‘€½G»ýþB• JÁ6PJXì ,‰§†U†UPA‘³)*9Ž‚•˜¤µIIÖêB’7ÂëSF~îÂvy"ØôÉŠ½ÁžVˆ`™DP¦UU5IÕRC!aç}|èY娞ß*ñ[l‹MP4uxí @úÑ*šT2RÄ’Ÿë…Vjï®±j‹%ÿ-#ÂÈ›PùD¢¢ù4‰ õ€”­*ûUH¡ /Áä•7q%/Ý•OÂhöXçͦÖ‘ÇZU^È w'¿ú`•h„JÔe ‚§ ø¯S¢àDŸKÊÍÍ‘´AT„"È P9 Ò–*¡!)wHwöì¥ À€†–FX=:ȉºXH>D‘ ‰ËÄÙ÷ÿ¢?È^€'Ĩ=ATq:ÊôèCÞ‚”*½6øÀˆA­/UP’@ ß[ñí­¼úkô]¿'­½:%ReÞ•4Š€nr ˜`6Ô‚á…S ¤ÅMF鮬ÕÞÃIEx¿'¯»´LLqʤ @¥dxƒ‚V¼·ŠL=·fk–W—u(ÒåÒ¢\ÓD„j0p²>$s“dm$ÖDRÅ^DŽÝ {$Hœ¨H|¾0 ¥¢šhª>ÔOvúb ÅÀ9ªh„b °´h?Š;ÿoQîŸtÆÕûíþ|Ýš¡òÛ‡,«ò Ù½r³êÅ ²5ueç5);gZÑwV+üåæíPnªr›TÍt¹ S€½ç)Š!7‹¹5¬Ä7Î&bžJkd*ä=èçSQ*œ¯N:æNw˜wÔEZÎÛÔî«°oíú0ÐÜ‚ÆîÖòcg `Ø Ìh•€$œÑYYŠ4’Š-ñTh«»¢¨ºÞÚ}zÅÒt¯IG}Ýü½B©)FæÄ;ãºÚN÷oEYÎn2ËfeÞì6áZ©©3:Çûdv"ƒ ¯ …`„®0¯-Õ#]§MZШzŽP„Š¶í›ô%šÈ2¥"@+8‹SÔ‘;Œñe Ô‘wÅ(ïˆ8F~rÈчë;4ˆ½wq®mÄs˜e‹x¢Ý˜5¤•X¦ªˆÍ52@ÚfuÎûÙô@«Øöaàï¥Z¦‚×9ñ^î[øå"ÅE‹4'EtBbÇŠN;ªY!¢hËbæj)J•bӯї¹Ê ÑÆšrAñ´cÑz÷ÖØ¡¶_Mž{LRHKˆ&’àÐ`ã‰Ò“+WX€‡ B6Ï.†‰ElÛRhW»¤ŽV #‚V ŠÅ }ø¬¶YEt¯M^iyÎŽIÛÎŽc1»û41ÑÅYhî:½708/]ôæ§k«bÙ™®¸t"OIˆ:íÖ|жoiˆwºîás€‘s0½uT{a (ÉAµ±`©%C,×5ÊÝ»Nê1+”¨·+±-°-i ž=äJë.?ùüÄnû~/—­­­ÊÅŠ +€UUUUIUVõšÈ{\æ4<ˆðà&…Ïy*ãEZé’›q\4DàEë%Zƒ Ô{è&yܱZe^ÀÏñíq8ØÌMâ<Á’ æEY§.6Ähâ55W­é‡Ï׌°a×L<œaÅèiCPe&P.CK* 媲†vUonž]™Ÿ=Òvy†ô$ÄJTm ÐŽ‰"MÒ‚1Å©á@#1†ÃÀw®æ{§«pYjiëϸl­0Æ Ð¶R†ïX+ U«4 ^Ä]+¾© aVi–]¡DùuÀ_5…ÁvX‹sœ CÅq\ËÚ8dĸÖÇÙ¼º[=±7C;®É&È+EtÃ[y¬ÕÙ`O[è˜R£Ž,k‹º)x)ˆ’â¹3§ ·tJëdŽSmµÖää>n³¸âèßIØÙŒLLaa­$;P«¬­Œ©“eIÕ±Š¬G— É\ÜLçzì¦*leÅ®+§Ý™×lÓ%8ZLõZÕDîã=}r›e´µß>==à¹4.0õ»\Pt¨N».Ë•QÕZÝeh±»Uaœºtû œrQÁÇN”ÙTç®5Á·æ7ÜÈzª`”"#8­ ‡{«)I™”·Gfì*µsYp¿‹øæ „•mÓ¡Ó’½ÑŠ*ÊkÏèM¶€ÙŒkïbΕ½@#s3©ì•,V¦€)·z¥þÀLÁ²«x„heý `û ˆª‹u¯RzûB$’G¡ÙCÁ¬†¡­žMŸ¿rúFá¡=´™²9Æí•UõU0çQütZãð‹Íèó‘±{ü›ìLÖ#T àMN³„ÞùpÈÈë+…ˆ<„Öņ¤’M“X4„^QÍi¬XˆÄ “°qQã™×*­ñê)•ÇÇ!ï•2D¥E´Æ}£œ=˜C*_Ä~D‘ý„…<Æ ñzˆ.—½P¸Qa×~Ìð² ‡CyÚA]‚/ʵ¡#³ $(—Á€˜“€£Ž™b¨$@)@Ȉ’È⥠CƒI,Ê… i1Le‚eO1åtݲS®`½µˆ.³Z3 0Ö/´§ðÎÂH(|gW¯Zìõ…BpØFî…GäuÖ¦E[)°x7øoõ«2šº²LËÚ2:3ùÅÞ8MÜ5’ýxÙ6˜²ã&M}r0Ô+ho ±dAf¥ö00H3 ‹uŠ•ÙKCDq¬£@´­K ˆÙ¡Ó y ®0vò<&ÙÄÙ®8MìÚ6?´Jû¸çS¤¦~ã˜ÁÛ¼ãËŠÐÂ,ÏàŽøZª]vê—Wi¹ªÊ¸Ö1øßÇ~Ù€vœß©¡‹$&¬–“ý*‰4jbŸàýè«ÈO+ò#ègS‚¢(ˆ”$@H$ •YZ¬²ebk[!Mš°Ê´±Y[mkJšY²€³F–ÓKb¤lZa¶jÍi3j,a­¶«h­°=ƒG ®ß HSLŽ+[}<õªÞú»}ÿ€ ÖÛãYjö½½v9ZzÊ/Ê‚2~™}%Ù¤t/~s0ŽÑH´~DŠÀú.ýzV?¹¾;5Ýå¹ÛvYšBBžj(R!ÚÞÐjìÞøMJŠ©\º‘$R Õò†!£¾D| Ýn[CìVØw0YôŒÝ“íÛÕˆR;½«(7ɵ˸[gL§Ê>ü{¼w½²ÝïKÊر…‰Ÿ¼V+/レËÊè $;lѤrw¢Ê)R8ÖI5Q£¹Ò*î’”o ¶"lØ…®Î+«»ôÌ¡¦Sx,x´’Iè–UZ¤;zÁèpq˜ç’9c:“öÁ¼d7-Ñ#¸S1T΂¨ô‘™h¢«Œ|Ï Ñ=ÐœçAÍ)K”ÒÁö¸2ì.‚ˆˆ,X–·±‰n^0ÑÌé²om‹dq ÷C’£}Ôâ*2Bx(ŒXTÒØM¦Ç‚tBC¨ê—¸9íÐqÀêuYzqzÂo \®ÄMpW’y›[ÐÆÂèœiîÁ.Ðì=5W€a£¶mØ©%²©a3šÚë:Ö¬ß!®tš+CT¦-ô¹çƒ‡Š4z(©ÑƒJ‚• )R B¤µÜFUñɬ˜kP¸Õ逜55vš`þ²°žLŽŽë)¤MK[d”Åi¦Ä‹¡ŠY\dŠ„›AcQÖXu¦‚–Æ^{ qP(hí@€»»Ô(¥À¯Œ•Tu „r*’gl‚°Ô*¬ ïYZ™ãÁ)ðÚàѼl[Xplb¥Æí1V‚ùéqlZ¸7*ìÍ-ù,d,E5ÌKA‚" [^m®U±eïjœPIs‹);ö Lí*´–«¥Ð¸VšÓI'0ºÙ*š…pèhi&i}–T¶4ZïG^€&@ï‡Z£“§o_a¥¥­l#xÃq™6‹è9 Ý•|µÇ1"š­p­ ùZK±j­ŠÕ@ 1g"™”î‚K²Â Æ°(W`ªÆQªºbÐŽ´h¤¨L† ; M#U]lÅ.Í«¡«h€¸|‡JóY¿=™‰[3#·žHÚ:’¦äI¿}×}etF›‰ëAέÇM;ÑÝ“ ²F /@¢—⩺E¯ºõ¬;ÌÞêËZv Ö·h)÷]; zJÁŠJ’0¼”¬ñ¼D³,"2ÁlÆunC%K, Tvteá -ª„ÕÖí×v«TV6éoãgyæJÐEy€  j`(Ö*¢Ð¤6Ôä®Ú¤§C29é•KDëeA;˜ÑïºÔÝMý'Ê}äJà")Og\öñG8$FI…„$–˜Á –]c …‚‰DÅè‚õj;€–d@ЂgËû¢Â)æäßüu:#òŸßðÂX° T[,,¬ÆÒ³Tb0&h6T©3 “Z+2J’f,ÌÓM4 M,Û)„…)J kú«õ·õ»Õûçh£Þ‡8DRÿÌ:GËxGl>¯°Ãl>"?Êj úUüë· XŠðSƒà3ùà ¢!†‚V€éòqweý²¸>õPÀ þr&‚ƒìæG˜¨h€ÚXpò©èàª04¸ŸBO 0]"‰"q?1"±¨Uc/ªºÕà'ÜŸ QGÉì2zîB&Tí l@ 'ñ™¤˜t…`•³5: Øcßsë?À+ü›^ªýˆJñ{ý§†ºÒ>0|*‘0†kJs0EÀd3 V¡#Bâ(ÿ\àI>¼È?.”ð¾B˜UVÙ©‰–ѪeR‰õªŸž $$›ÔÐÝï$4† ÌwŽ‘O#Þr$¨xã‰H‡üQß«Eå: r-$”¥2Še3†H9`‹(V@u*e5»ºÛ•­—»M,Ièã5àçÂ$¤6ï¡©&¤Ö•,AH–‰jZCQ^sð?|À P ùQÁ2{~ÌDûgÀ(Ïç÷dûŒ¥}èæû€@IDT÷Ã÷Å0œ|–*FŽß|š—ÐœÉ F@´I,žë"æ²þ(¢&1’&H„}âå|“á4Hˆžõ Q;Óú¯w÷‹âGQ?—÷þÏíþŸ‡ÒhÑ£FŽ¤“Z¢„!ÎýÁU¤¿] |¨O+!´¶@X ŠÃòû£þãÞŸç˜ÃE¡‡íÁýHŠ„B‘î‘_‹€ð3*CÚ89UQ-MUUDÂGEá!û·¸å6Žþ¡&é¨N…ƒî†›ÑB¡R†)i¡å;>xÝî Èýf³„|“D!JíNJNÐrAÈs-.@õXæS¨T•R]t£~™1±Á¢é9Öý8E ùø͈“•fˆ¾W§3{†¥ØÝÅj…¢&âNK¨Gƒ4¿Š Ç&®ÙTVö,ÊXºæöv ÂÈ–ÇÞ £ã¥':*VpF¯˜“ÃbZ·j­›ªÕÒ¤Øh°Œ‹TQ Â:µJÄÞbv± ¯8x"M›mlç#G&Æ] ’u!ô sØðz‡#Á)DZb4yyè¼¢.€§Î!¡Ùv¬¬æ5k5ÕOÇ#Æ»œ°ëüAàƒÜŸ™&UÂx{’ĉçîBÅ–G¡!Ä:HÜJé*©Äq-I¨Z$vzvQýÆ ‚wƒ?xøªJçþ®2ÈQ¤˜Š€‹ð*«†*WîDfbb0d¥™ƒ§A­D”`RY«(4ã )AkZt­˜eTkZÑý_^Ýl# ˜„ÌÁ…¦beÏ×ƪÕR›30k2ZUI:5­Ï8œ;Â* £032„ȸcY¸Kã)„A ¨ur¬n´JÍ$‘”šmHC)))Š¶×ª¯&«m¨Ñªò‹®îÉN¥q²a&â¬$²¦aˆcº®Ývf©E˲]›]2Ã9º¹]ͺÓ6Ý[dÖ€¤¥B˜JûhýOëÿ×ýþÿ¥þƒŸþÝ8ê?áûð¦þ¬ÿëûÈ—þÿêt®Ù¿â Îÿß|ÜÓü’ ÿN¾îâ/ÐÄÛL´nYÕt@t#uNýâßú³%ÛYåöÂáüñzjÏþÎý”®ÐŠËÿ¹*çù†h¢!cË¥ïÇûu°éŸ_¯ùSBÄE0DZ„¤ÂSZ&«ýj°„ë”ÿT†„’‚!>ÿßFT”ƒî‰ÿüÅd™MfÊ#­¨$áþÿÿÿÿÿÿÿþÿÿÿûÿÿÿøA!…ùxPN_=ѵ` o{„5´öìwØð)è àºûmµm‚Äóxò¨D 5Ö‡B•*yï÷;”K7w› ­ªG1m³f ty{4ô¾Œî´ã_wÞûï/£"Ù•{Ùëï½w›ë£Î9ÎÁÑÒ£Õw¼ïF³{_{{+wt­ŽuŠ)¯íë ÑèñBåw»¹X^—snÝ×À¤^±Ø¢Â@sŸØ õí¹;­¯›u,ÀZM@§»]ݪß/Eï6̵ý¢5ÞŽ”P¼h¢Iž0‡ªò=𺄟PŒœ™[›8šèé6Ú»¨ßo`+r\y%w8CºW)lq¦fï¼â‡5ïw«±ŸFÆeYâéǯ€ÁŒWqº}Øäõª‘h×]zàÞ´Ù·w3:ç-]Umïî­d y&Æ™>µÅBžûÎéêtz4Ѽ6ÇqÁ scÛÝ…yyÕªèI•8w±Ü‰çh99;×»Öš ØÍ…GP] :8#­J\¥ÒŽŽ÷wE{ª[(µó´h4Ög¸ê‹˜ä½ìP]}ÆÛz 94Úa'l«7ô85åà˜{GMÆO€ŒìVžR½Srà1¢€$/¾ð÷8 /Ÿ}ëâÏaó=y.ó“ÀïxzìÌftøïŸIgÒ¶u€]Æ-ØÓì÷%J®Œ‚ %R”é‘^ƒE¶@±j*^Ì¥E^ó³8È@‰ê‰i[BÅv64¯[­XÙ¶è5MÜIÛj=i^BóÛºl0ÈÛÝ,öÕ@óiwwS{Z°q)R^‹gÖ¹bÖHTU{éÜõ£Z¡D$½ìí²¥{0QPí¤}ë¸&JžÙTÖP“YH™·CU%Tíª­¯G/AT@DBD²pË-{³˜¡)tÄ¥;jrØ ÜMYÀ ¬ŒU hJJ¡¹»Z'ZU8%i!&Ô5u¡Y•‡\lQö{²§É}s¡¦‚Ð4@L†Ma Oi€ §¡16£ÐÔ<¦OD)ˆ‚HDÈ&š&L™ žõLiO)íHÓÔ=F€ 6£CAê ™222hoR¥)êjžF§¢6 bz¨¤&€‚dMQæ¨ÚˆF€¨ @ H"h2L4§‰¤ÓÓSBzhÔ6˜š24i©£ÔñM =@¨‘@šИQµ©ùLÕ3$ò&G©²F‘ Ñ 4€ ;¿Ø'ú“ý'ü'õ¦;‡÷Å ¿Ó)JÕJRµ¥1r¦`]"?Ã÷k÷ÿ'ä$¹ÂGû¢#ÈN—øwn –DŽANÊhÐâi1 ŒaÕ†vHE6GJì¬+Š¸’Š#ƒ`Š. ¢Ó))i)i- ‘1"ÀˆÁa”… X0ƒi …˜Š˜‰Q’‘’ &*™ˆ1$$ÿ‚L#š(Ä“ d0’&P,BÔ#ËV¤2I$jT5!¤,C$š b¥’-¬$” ÉPÄž üLÑ)ÿ‚lm¨çþVôfk®é¡ öÛË[1Z’[RB9#—e¨îÆé[¹G#PIBmAÛC¶+N[%Üš¢£Tyž6ÖaÿŽŒ…_ (hØËÿ(Ðú}f)¸e†²Û[õ-­¯ýp12#4ÑIjcjfÚ’¶¢Y¢“†e4A£XÚ*KD‘M0IPišhTÖTP%£cÊQ¶5m&µ*“jŠ´Ùl¥HÕ5bÊH²¡@¡@…*‰íøòÃÏGû‚ ³ü˜èlŸâÿý?Õý‹þËäéþp ý¿æÿ)ÿgù¿Ïþ‰ÿ½c«¯§Oo=¡×½†»ü*¿àë ÊI¼[ü8ŠDrk‡{ ûÉ'Ä– °ßô2í$’CÜ÷úëàGÊkÿ统 ùïÿ`á˨ÎJX÷2Îbr€Lä¥ép¨?³ý£ÅV@loýš}¥èqÊãñþñú¿†€aüòó}_Þtî«7ÿÅß»·óQ‡ñÿ7ìý?¿ó×!̓~ßäý߸aûö€šþóa.ßñÞ¹5$?•Oˆ¤>|u²4ð“Â5Ý:™–Ìt‚ §û›~¿¤d³‘¤D ¿·ûRý?í È0ßzï7䋬0òÄW¿¦¼xêÄ1 Fk ÿ¦ÇÇTõý¥•1”4QF##bˆH$íú~ó}vúpÏñìøbéÏIý{†áõ¢1›¯à’¿1ü?€… nýÿŒpG'˜nz«Œ8n‡•Y)äåÔ¨ÔNïºtMtìþI¾ÀtÙØ0×S³PEÈ*¤û9³œ°ãê‘š˜=Îö/.]XººÏ¨  ‘@$êšþF/× QMˆìôž—žîn:J ßû»n¼ƒ¦ìWP¾‰K’©:ïòý¿îý^ºSžWw¼™šåâ#*úÌA$ª©6Ÿë"@e%ÓÏÿo? ùÊcÔ9â}{zµ°SÐL‡çþñꧨÿ ,vYovåÿ1¸ ¾”;“wÁê ÔS· íØ“OBXvöú¯ȫû?àþLÌIÓi%ŸÍÛ´ÒNí½÷¹˜“¦É&+WrT µÂ€nÈí:·á„õß*î”è†l¸[° My0ç‡_v "xxï߬±Ø ÛPFC£˜|š&°è{'||ºÿïŸh ~?´d"b˳·cžHˆ?pD@èû¾ÚÓý”þŸÀsûÆÑOó£ýÿN_Ëoô–XÍ¿Gìþ¯üW•ƒþõþk'ðþoàÍüѲ»òìÒÈ>[?×xºíþ¹öô¯]}RçèãÕ’­ xS¼pÉ¿_Nºù"RåQ|ˆžçäãù{pÎÄw¿–ûýOñ¿½þØûsìø­ø¿ÎãôýÓÙú¿­Ï—´ÇüŸâòþ‡êùyyyxñç_?Ýýß}~ö=ž[%úøwÛú±ý-ðþ¥|9x*¬¿óV”z*ú=a‹Çìl¾¯·,àpÉÐQ3ñÇ•½vÜÿðŒÖÿ#•ÞGü÷’I$’I$’I>7h3êí‰r¿Ž1òò¼Q`q–­×†¬"">ËëÒÝ}£—.Á;.ºÿf9lk.{xæÄ?ŸýÇŸíø6íømû5ôò?›òiöõþ§t†÷·N—[ÏÕM—fzîìð`ØD÷ÏÍýØumüƹý»/1<8ìÝ®˜}Þ†ãÙÓ[â]¼;vRM’S÷?$Ôj‚•mÞ8kªØØxžŸ^Jðüž0~ÙFýï·Ãß×Ï«ž9.]2Ü«­sñuðóSµ5å®îw ?›¿¯:c£î÷0ÛܯªÞå’y^Xj?Aâê¼7¢’P?\•ú|;«ëïÓ…[Õûîs5þ£¡þmˆ¡¾œ[Æé0±TbŸ’?ÝS±—§»¯Ò|=H=½Ò·¯†gFêó?žo̹Ҿ^O§^]X©öû®¾~.c×…°®C=ØÛp·ÊÊh²>ŠnzÏêÃ>Þ¹nüiøžÌ=Û½Ç^]ÿg¿¯»‡Ã Ï»Ÿ_§­“üU»%ò·f}Zz6ä¾>Øøs¿ñõD¿ÎAþ5dÏú¾ƒOe@ö­:ÿÞâJ¿•Y'ùŸ¯å×ú6ú€`k_ã°Ùÿ%C?éù?ÎÜqm™QäŠò¿á+K 3#"å‘PúNõ1wOAÑîìüO·ó/ß~sîûÂýϳПìúþ>Á¨ÌgìË߬øZÛFц£—nßœmù|º°Á/qó@xŸÑ³³³|ù/ò+pßÚDKâ¤ZBC]úi@1ÃeS°}y÷T ª ǃŽœ#±ÀÚì»ÔrÓ»7ã#¶UÉvÎUÓ”SŒÃg?]P›Ú£âƒôäÁ±QÈ B|P‡ÿp:Ú·Våþ¯íke€Š~âýúØ?Á݇*ª’¨ú·±ÿðÍ»°ÿ/w>["ÛýÓìý?÷ñê¾N+Ý´=êÅ?èþÏe¤$”îõtÐÇ“þÝñGùýÊ `¨ó7OÊâÿá×üœ?ÁøÓ×ã‰%¯DGŠ …QB¤H±#óžÓÄA¢°üÉîñüZ¸—s,´œzD”;«xþØà'Vœ!#~[ìºýŸèÓw÷xÿ•óõ×wSÚû!;Ëø ±L§,õ ±A¿7Ë9–ì$(“ð–Ç]11ÃaÿÙq•SûÈhþÒ3žrÜÓB€lÿQìID’•z¾lÃJ kýüocûLÏu6ffÚ7ÈCh4ØQ‹otÐÉß¾Øõ #hõU¶[¹ßn4‹l¼äá@ôƒ9+ÑUAFÔ*`Gû$ɇ?à6 Š28tQ™aQ¹‚ !’ÃÈ/f@F:`ƒ*Š¢…¿‰Gž+9Äg$è]ªóW…ÚêEïíò­^M,’oÆŒìç^93šì$廫¶ÏV>Tº#2uÛY£R/b°˜ ÏN³J[„¢â¡ßÌaRJŠ¥w2Ö͹tzÛ  ˆ ñœÉine TAå³ê&"ní´)S†"8\*ðaä!œ„•r I`îÕLrÒ©j]–®îÙvé”a¦¥#èÍé—¯¤é-[nä^Q«ÃZìqh4ëžo+2³2HÀµ#g{¿¥ß‚³©ó< Ô Ìe&ê-xËÇ.íË yë{•…œsdš2®AÒsâMøÒœëÇ&c3]„œ·uvÙêÇüAö•EPû–ºîÔ—,wNp°Â!„åÊ{ë)­k2 $Í*ÐŒ»U1άÝï½çVs}ÎëZç/Zæö¹ÖQ£nï]÷ÞNï5m:˜LZŠ«W5­kœteËÖ´­kZ¹s{ß{}çW{ï{eæ)ξFgSÙ$¾kY;Þm÷›ìvk™zì|Òçw®æ®Ü½o—}ç7½óœÌÉÎæÜ]ê\滥¸¯™×šæûÝœ7—ÎãÖ®ò÷¬Y›Þc—3®³]ÍïqÉÐç§]kÞ!ô¥îÁE?ðI0QM ùá¥V% €¤@šfrS5QjùÖä6Ô¦±m T›TD¦ªim¦Í26“jÌɶdÉ©iŠd¹¤Ós)µ#U,Yªš¢¬ÒQKY°…„(„•?Û÷kŸ¨ RšlÙ·ÕÙ?W©˜ 뀈ˆ™§±æ¥hjA#ýa¼~n1ù;Çýsó»Çyt®PÿŸh«Jî! <ìžW×áð½äAbô)ÏMyºË½z°„DFå‡Qn!1¨ôÅ ‚ˆúuÛ~¾óGS6Ã[´3“ú(éÆ#•#O"Oìþ¿W§käwß~7¶¶à¿VJ>Yä‰ñAêéÇø¿‚¿òËéû×ï ˆ;èU76~ôןéä6ïßWûsú5ÜŸeù>œ8…U?«—N]?7OíûG|ŸÆ«.ꨕ½¾ÚH{’ô }HE@ªBb €cÏùÁGä>(Íõ?Òà°H9 õòžyúeÎ?»ŸùþRj?”(þAú|‡Ÿh܉Üðž•ŽÿvA§.¯pííñÝÕ9û9u,Ö¶­Tžóåãá½!Þ‰øÑ(ªPôÀ}áè“BH®xw|ÿ@v|üŸ}•ŸÏu0}éò§Ì)ï>a` â{oÉ°pUSáðó¾Ow†gÇ0½gÉíö_i¿ÿžg'žÇâÔIB5HDMAkN!Þ}œo¿Ã3+Ãè×?>ò:ÀAÖ€½› Ûa‡KŽ¬Í¦•—ü}5­çP~§ÿ„Q=ß{²¹¶ûÞå;߀/èCït*ˆ(vôtÎo°ö>ÏfÚþ=Í?úÂãë=~­¨íÇkÆ™ ÜÑQóQGØ@˜ŠÔË +TJ€vvq˜µÄ]t Çh¦§Œh€U€ ^9Û5¢ $Ì)DÁdé&L8b€b"kï .Ò3k5—ÂÛ·* À‚y(+”´v¤Ð}B¡$|¹CkÝ:ßêÛçÿ=ÊtNÄ4ŽÒûy_MåuxñZýÿ¯šyŽ™Ýôñ¿+÷®H茑Ӟ}}5Ag±aåÑ”ûðfSÃÏ<°ÿ½Th Í¡EkÁvu8‰Â7קÜ£˜ŸmhIÏMD“MF4Ä25©F´ LNÔ±½››ÆBªŠÖäš$>ŸàgÏ÷=¾˜äÒ@{˜ÄL|ðÿrZ'ð«w§ãO´VÁþá÷2ˆwwÝáÖû¼]ûü½¢§zøÖ¤¸ö ²7¥pDyåÞ@ ¢:‡Q àYêçÓ²=ÿcú¦ ñßo‰ (ƒP€ `ûÿÃÂ?ððý_—OŽ9ú=»¢LÊ13ü5¥µÉ$Ö ””©§^×if 1Žó€Ðß75ÉmèðtIBfS%´uóÁÚ/I’œwsÇ£Ñ˹Ëɬ0Ç"’–* ¥’(fÆç9RUeVi–dŸ¡,˜Ñ±Ó§Nœrs9D?~”üI¢µ™l$’ËTÒ“S4‰EEñ@ úï|WÕŽÇÍôéú%ùȪMúaÒy†(Š)È7ƒm±úöç}}X+â !@øñ~0|²ä}Q@a¶òßl}¿ˆäËêç~Ÿ”ý€?„æ*¢eEÕeLˆŠŠÑlX¶ˆˆˆˆˆšÙV“Y,ÙU4¬¥¢¬PÁÁ"£¢Ô︗e\U ·ÁL„ rb J®J… –FH.CH~†dùàùúï^µ£Vœ1÷ 5ïäÕø£4m¯u·Ù‰ø£î‘ð”Gì‘iOºL…>ü&ë•TÐBa’LÄMZüÿ£Ëµó­µ®÷(~¤ø& žáUSáû~?È~¨ú;~ ímÏc°ª©ÂWÒ~c°tª¢/ˆ~ùÒß9÷ùk“îOÀŸhðª©âø*©Øð€0’Hz°Ç4:wå’%åqÚ«}ÔNMŠ1"¨7°ìkt·önìü9ësð»tðM êOà˜šOçI$T’U! @-ˆŠ|%G¨p÷PM|?“ú»Ï$àTvé¢{öã>ÃŒ—¥âŽþ(C$-VŽ·Úëڱ I* •!I4-S?‚¶ü¦ågÙøœdúH˜+{L^Æiö}ªÉTP{#u%o¹€q| Êû˜6Ï“ ºa}â.²œ§÷òˆ”|cS8ŠˆŽQŒö/Mÿg¿lz½ÌAõIXúž]3­Šš,TçN\Žy Ï~+j©€·7ha”o?Té3< šàáâtÅò«Î—V¶ªªTÎbM—sšdXŽ]…øœs©Ú+îú}Ÿ ÿwÚ×6Wa! åv)áƒv‚³˜¤”!×f0ìÌÚ|¾°Â0íZ.¢€º gÿH’—ô9]$!•(Sµÿëj¡"DUçß­+¦Ã>ð q6µ­ jØÛPëÄ¥w.»Úª[†8à1¨½èÆËyÝC¬^¥ä@0Á‰ÎÙ FÊÛ|´Ë–è¯,6­”òr¹! • Ú#ª×ºyõ5Jì$$îW–m¼,ØNAÙP¶VnQ&¶!Ùôg®,ˆ)n6ŸRâÓ µ/ãøˆ ****5Q´•&Ûi*“ZÔ•%¤¬•%¤©5%Iµ¬•%IRZMI©*J“RT• ª*Š¢¨ª*Š°ªIRT•&¤©*J“RT•%IRT•%IRjJ’¤©*MI©5&¤Ôš“RjMI©+ePUEQTUEQV)*J’¤Õ¦Tʤ©š“U2¦m­%RT•%*Š¢”(¢‹*Š±IRT•&Õ%RjJ*Š¢¨ª*Š°ª*Š¢¨ª*Š¢¨ª*„©5%IRT•%IR² ²HUa îÆ ƒ+€P6¨Ôj–ÖÖÑú˜~½„ßôóËÇq›UkÒ" -#‹ôü}µÊ|_| ß9uÊqç W?Úì2(à‡ì× ¯çöëøÿA®óæÏ Ïo;";bbPï×?F½Ò–8èv%c»œÈõ{N<¾ =‚ò‘@¿0…‚–k|µÐäòµµ ë½afT Ñ”µ’sÔd*üÓt‚-m|=ÞÿÆÕÑqÑÀG ƒK%š£>וôú Á{„™jü^/Ÿéɤ$ddvoz¤Ù,ÈH÷éßËL Š»‹V ðPä4â˜Uå?£fÀšÉv-R¢‚›œÝJHPÄ‚±dLþF ©Â-U&2aƒ œ3äëgŒÖµ¶Gm×Y NAð vÄ5Õü>0ÁÔªÚv•+EbÙ>Îm"ÆÄ(ñµ”(R›#HšÚxáàÃO2—¡ÖÞ”€Ÿs„*¨${JL—Ùñ]™@ˆˆˆ L'ÜXU·hŠ-kV–#•,‚éêuÿzˆÿ½DqÐÿéÉì?>fc‘燡6»ÿ7¬}%~ (þ+oéÇî½dÄŸ¥ó D–¦Ȯ¨ç´Ot‘=¸íáïoOÌæ¾ý¯Ã¯-ëê @îãéÞ°Pì2qPJaUœ‹H£ÊÌI˜ÉËÊ"swÃ4ùÓÚ Õ6ÞÊž€ˆÛ·:>G™ì5¾·ß74>OÕõ?×ao¡8ö€¢Ucr30ëFØPžHêlʪ«óŽ+ëN!,”¥e0IwuUUm¶Úq|Kߪ»¾‹_õ>n!Ý’Kü=뽺‡°}„‰rÜݶ-hÖß…;Üì{W÷iá…2šI$FÛgUŸÃ೿õ{R£ô{É.¾^ªûÿfG2\¾?¡FÍŽ©º+C½å±|ePQ*«Ÿ}gÁô†˜œžÈa͇ûÁ'Ç/—ŠÌ ÃÁäAgµÙ|™™ÂŸz ÀïÔϽŠŸ8p%¦Vé™$ÝÙ 2±Ö³t>rÐîqU^;w›1áîõÿÅ÷`” ïø½ÒΗºY=ë%ï…ï{·`ƒáãöyKÆ0hª¢£`œ`ÓòëUšJŠŠ‹Hz"ª§ªtBE‚Vµ§@Id:7–´fµ¡ø¡ºOpü•|†Ç`UxÏ?œŠˆ´ý[¾;æž›×g2«Úz  »KŸÇuwy\+–±ê¯TZûëSM¶Ûlm°ÏÕ5ç×ù¦wùW·®úÜ’}’Õ–\µeŸÕ¶Ûm»?J»¸4W=ߺü¨ÊªÛ÷šç«Ë>Òãd"ê¼aäᨢR“R­c *D…E¡:üúüþ©þ£ÜBD‚¶Úh)QI‰¡ »>Q¬ÝÅÌÏè>É Â$8IæƒÓÕךÕÊwö*ßbð€ÅUN™ESô¯ä]é!Æà8ä%ó·Ÿ™\0$ƲWi#³?Å7÷ òAÞ€^Z*¨÷¤›`>gžy®Ï¶HÛm¶þ˜Ó¹EOo¢ItÆëË»ù䙨îìbû€îzt(TõŸBðú~wè$Öªª™'¼~CßYîÎs3ˇãTaÒCUü ?Ê÷ûèóÍ\’I'—w$’Iý§çÿ°?V;rêõ˜«™˜¹sëþQÞ>ãí×]fe¼R>I.¾ù™¢±˜B@„$BEý«BÖºl5C”ci~Í~È{£×·=$º{¢N¶õ»»mÝÚWi\µv•þUhZQ7û¨$Ö=~ª"ªªNAÛó'µ:'õ§èOJzúÉ>Äö¿·Úÿ(vMÓ·³¹0Ë$˜"2õÂâýÉAÏa_À™!`gæ*öYfImŠÎ–Ý•÷¯“¢‡à’WZÖÓM¶Ûm¶èY‰%•—”7Y¨Ü8idÓi%þ*+ø1$M¼ŸøuÀúpÑ=®×yànç@s×[í/÷~HÚâ#=ÄÉÚõ£ôÖîøÿú-.ýʬ_]@•lXS+{ƒc>MFBHBHBjí¶šmµdõèý´~T"󧯩çâuëÚí¬ãZÖ˾Ûm»¹ÌU`¨Êª›ï½ž®žÇO˜îýó–ü%OÍÝܽXw *ÙúCõW”—¶Ta‡¼+ ¸­¦šiÏ)MéUTè~ïÎòͶÐêÍhÌ—ðU$–¦eÉ"R2âN„ßÕ5c¢ 1ö dI$à%ßÁx)ù¦ï8VœÝgÊDJ$§Úöý¿l >d“õ²O<À ¿ºœQ¶Ûm¥§ûüw4éÑûÿÝþò][³éÔ{±¬ö¿˜ö·ê¶lÂé´¿i^IwT=Ê|\sÆmÛ·îÿËrI$tì²Ìÿ¥ñ?ƒLxÔ¦nA·jG=`]¶ßöQõ­Ÿ¦æ(ü Õ|zíyíõç2}^’w²£û"wµÇÌðôŸ¸ûOª+È:$%^?Qç…†fÏ@O‡í|1»l^ïkèå·}Fù}>ËbIö&'áM“I‰‰Õ?˜’ãü/9ÞHÛ—_¨º=ètËoKTÛ±¯±ßÚa¬7ñ/½U©ÌÔŒ[¬fa™ü¿sÃh©øÆ6ïßÆf~\KòÇõÇÎ,q<‘ó9ñw};‰ÌU­÷ʪ¬Ì<û¾ÏQ]r¬8æç9ûÌõìNÎÂAÕ$#¥ï‘9;¹ÚAdTPÉÈHŠ¯7ƒƒsÃU"èþOZñ·™¡Ö±ü€8UvHämí»mܿ‘vØ~±‰Æ«lÌï4"}€í)ÏO€= ¾?N—»¯\ÓßÎ;€njß¿öj·ïP?hx<{^ɼ½»UUUWà{ÿ3Àþ§\q›Ö³3¿Ðí¶Ù•‘žÉ;¾/YK,¶Ë,²ÔÝ·€´J­¡£K‡µËקÁ:xð|‰èéà]_ßãó{âr]VÅ÷Øtfµ­ë{Ö—%ÀÄ­>Ù7`êY³U\{Û¦ZiÛ6]ÝF\"Åi¹™YÑ!›þ™çãçxÃЊ-JMUÃÑB»¼33:I†Zl÷+óþQ’™óÃì?;Šœ$©™£›çÊ‹?³)à œ¢‰c,̳)·îyÎ34TõbsÍWC ¢t~qúÕÝež)ô‘îGÔñ·™™ž:Õk3ôï‡}Ëò;×××Ôm·v|M¼=zàkìÀ»Æõuwm¶Ûm·£ˆ_O¯ë³ô~…­ÚþŠ?=qGéûÊ?1C>[ù6û$m˯ îSRI6ww$Ž$„Ã*¾¬eA1Bú„üO ½óÉ$’I$í¶6ÈV†Y/9÷×Ó‰Ó§§†£ŸrÃú(ÿG®s®”Dùí¢òë&KP¤©ì£*ºf,=J¥?‡wKÄ’g4s¬érvíD/^;å‰Ì¿Â;záw™'nMœ¢ ÜZõ·é¤™~µ9Ä’™$>_,+ç'î dxݶþðýdHÒ׺U9ÛŸ¾í¶Þ·¹÷8ý€qÇ™™—$I4”n$‰Gï>Ö¥ŸeÕËy¶ÛmB’½þÒ³ü4Ï×É?¯ÙOØ·¶ÛÌÌÍ=þi|¸f`X}4W»<¹¾®ˆô}öšr…ë­¼’BHÛþü“Ûüt?m´¡Ñª1?ž”åØïïô=½åüµÇ…ðå×¥îê „Nz*s "j@$@Y(Ö"ª™ChŒ‚˜A ïé†Ë NlÇ!0% d’*И %'lLh— 0ɘµ he2­,sp¡ôOëOìwþºûî•:µd™¬=Þ#,œüÇàüUXY™dAAÏ-;z±Ü`;ÓzbÀ“YJ›ÓÓçþš|ô"YcÓ×Ô[õ¥*ÚÒFôÚ^Õ·ZõEÞy$š»¹$…P ŠU©ÅךÃKUŠG«­~ÕGâo‚ãmÕPg~µ–ºþñqkE_.è wŠtòñ‘6„?j?š28ú§Ÿ÷¾öíÞæõ›ow5nÚ¼ùr?•ý‘UMQÆÇY†I_‚ÖŒšX¯‹ñ9HŠßÜúGŽâªªªªªüG»šM¶íñ#¶Ûw§{¶ÛzüÕwi§ìVݶÛz1eDv’Wi‚·z+ÓÜÓ[‘»Áô{Ð]Å$‰ïH4²I·}¼ffffffHC…EFä’~Þ{vñ¼¦Ï‡WôXõ¼ü½xz¿m]äìϦyÉû;Ÿßê((9Õ« ýõG{"J/åø€~²ÜhA¸ ¼0$–(7üÁü"‚¡@9Ââ·´½fq € Ë4¹Ëîµý>y1z m±þá#ZŸkxsÞ†]'ÏÆò’Í©& á%€NîåÈY;ì H­{~[Ú4xŒ¹fxÆ——¿œTðŸ'¿o>‡§ö÷ ÜA1;Ä÷§eꛬá>¨»r‹uñ&ϼ¯~oÌ׈<àH/_‡ T@óÏzNs‘ú©vjÌ“E¥îâ ºÄJ ö&•é 5‹.ðÊ2D"´…eŠÌ£ÑAA áŸÖƒqùGºý7îA±9•*¡>€%¼HlƒóNHÂœm}†üªîŠª+@«òÈx 0âcɉÉÇ7ññq¯>=vO…Ýd#¶¢NgÕ$|ÍÅÞ«t¤ p¡D¸Àf”ÒÐ(ƒ†ˆˆ‚ëK_* è,& ”[=ÍÙÐtUÈX$%.½uPÔ¦±°ª¢!‡Éê4,=þƒ~Ž/Ÿ=XfFò„¬ü«›kY¢ üU#â¨ÝZÚ4ùE¿/–LÎ5ïòÎûIR½w¯šk]_àÇ·ò§at‚íF¬ÿ*õé/ë’~=ßœqíÐOî«? ÷kËûwðñäÓ_Ý3ëèôUQÈrMÐ(ù©½¸6a@0Ä’Iº®3O8 ŠƒÑT¦C’¦xã‡hâšT%Ê·49m©0ß|¨ï}I'Á/‚BÀMµ `ÿdd½Ì߸æ>ß9ß?ÕŸyVTúù×;òV±ó2]Fª¹âxŒq$’vKLª•Uœy€·FlB¤`ýD$Á¾ÌDqï$•–”Σn¡…ΡE&€*ïr ŸÒÐFeÝñâ<" î˜JøWVOO,víÄþ]¿‹Üø¼f2äð„>O)À¤Ÿ2 ,ƒ†ýY˪£ÑQÔ–PìOÇ fQ Ä•M:+:¦Å;ˆ”Êö ­OÐG à’?oÈ|GóìÒˆ¥õÔ³ã.› Tan$BâT0 …’w o ½œ#ý*ƒ•6PZòÊŸ“åô ªªª¡>Â~ÐïïÖÇâÑÜ>|¼´mÔ8ÚÈ¥uÖ^‰I7ëƒ}82.Ùù??ÁQWQt}P†pç²î«¤uÄò]D~³ÐÂ…˜dá©$“»MšÖ€‚ÃÆûX²„Úkáð÷{ûÐñ~;ð_øï[Û?6#ˆxÃO\T Ǹ@¦†˜‘K¤¬L†ÈúˆzmjPœ„ƒ¦ì¤$#Ydáé1‰MàLNÂÅs J‚Zâᤢˆ9*`X$ã6){Lsm…§R¬Ø¦ì-0q‘™'9j¬Ž¬O{ajírqò ³i´ '1Œß°7­€˜  ö"B§Ju[ˆ?&ãšU‘ýÍöûçÏü.>?&=Þ_BÄþo Q"!EÈ¿Ø°k;¥•¯äõÉ}ß`Äd•á°*à«ó×Ѫ*’L|*îJ„ß÷ZÜ—f͹ÚkYç-Óä3Ì ×•… ƒSSRá%¸¼·³Æ¦c±,ƤÖ_æzÑ%7Ç ÂXq—ìvfUUU%Hêë-lëHÝ»ƒâîü9~oæœùª“EU£5Õzº±w$’IÞ:È €!ö u¢Í@æ9‰Âò’ÀdýXæ3”ƒ ïg|3êUTúdURCõýyöž4ßGŠ)¿Ú}®A[œã}_´·×âýükoÈõ0Ó­O]1’¯‘þoâª(¢ŽØbB#í„@36r¨òÄ¿ËãO 'ñ}&x¢C,!"㎻«cõž\s~ݸc¦tFP€BUTÑ»Îjˆðð&s_¼Ìñå/‡ÍÂt:ÎÚk ¥?‡¯ »„³ÙµUMTTÕ]ÿƒÄóîåUS¼Û‰ü_»‘QÜã{ºKÝ\Ÿ‘{(€V”®3ë)"Ì>×IÌÞýONî÷®*ª±¾Ô!ÝXëåý]mŠµðhíN×÷jg/<üúgBä@¦¿sï¸Üg€?Üdfת³‚›ÒyÇõ®íÛœ¿[=%^Ìçžvú|»û}ÁÕ—æ„<<-øOl Ÿ¨Ýÿo«éÑBŒ(ç÷|ÕUŠðI(åòóò¼y1¸¸’zó‹ *¨bº&VÀQ\öÁæ’YÈ6ÛWNtÇŒcºóÛ²ýžgUž—¼þìúq–óxþNñ.l>¼‡zgòòzl´uEC¯ÌUUU –Î UßÅT¯uF~ƒšÚ¡±ûF/ovãçŸ9v;1Oj§o}.ü*ñâI=~ Íf'O ˜ô;Ïax»èÌ|f™ËuAPM$”)Œ—n¬Tˆ!Ö‹øs@¿ŸæÜÛñÁ€Ü¸Iö úr÷ma Ö}# +z|³A˜TôïH ™¶®† ÂIª´öˆëÌ(¨ÜD‰n¤P•aPè7\&üßZ¥X€FÓmVJ=Þ2ã§]Pa‚sV_dÐ2<£n96 @A§mB²;e²Q¦RÔʘ4~Ù˜a½½P=¸IÛŠ£Z* &XÛ𸌠‡‚T+ù¾ÏyØÛn§–ûmUUQïCžî#¶bœœ\7À-Ô,A!%Êè.ƒlœŠXsO5fvà$Ðè*FzIIÖmhÁíòXùö±¸¢¯ù×w§ÜDQv6>Ñ‹Åîëö¾®…UUUÃúÑÏÕ“˜y—¨ }Æí„gà?»n‘;„ËXö~ßîEÓã¯ðï|ôûð%ö³, žSñÉ^ïÖ>ýû8n/åûóË™PTîט´€æ-gƒ€ ;’5R2!¸÷TK*º3:—´‰ÖA‚öOh˜Šãj;Æšxó² r@JQ6 TPD„«VK;‚I$e®êËõ s5ïýn³ØÓsgôÑt9ù?Úšm¶ßr/wòù] ¤K/°„ÑQ  ê°¯ž0Âl]Xï:ô ×_Þv~út®ñá=“OÊ–wÛÄ<69ÛÃQèꪢþ.‘ÝLÂ1 ¤#ƒràö±Bež&õ £7˜’eòR>: £?`iÕWØ*?¡qçK*iX œ6™§ F£4Ö”5"¶„7‰¯áGÅ“åÈF $ý‘ж~»zÈG#AA5Ó5Ó5Ó×L×L×LA tÍtÍtÍtÍtÍZVºfºb ‚ ‚ ‚!®˜†¶éšéˆk¦ ‚M¶›m6Úm´Ûi¶Óm¦Èm6×LÚl‚m6Úm´Ûi²!´ÙAA ¦È ‚!¦› ‚ ‚ ‚!´ÛM6Ci¶Óm¦ÛM¶›m6Úm®™®™´ÙAAA ¦È †ÓdA6› †ÓdCi²i¶Óm¦ÛM¶› ‚ ‚ ‚M´Óm¦ÛM¨ ‚°ÓM¶›m6B ‚°Ci² ‚ ‚!´ÙAAÚm´Ûi¶Ód6›m6Úl†Óm¦ÛM¶›!´Ù6›!´Ù¨°B¢Á ‹AÚl‚ ‚ ‚ ‚!´ÙCi² ‚!´ÙAAAAAAA ¦È ‚ ‚ ‚ ‚!šb ‚ ‚ ‚6Óm¦ ‚6Óm¦ÛLA¶˜´ÄAiˆ ‚ÛLA¶˜‚#m1]“m¦ÛLFØ•ößµ^C9£é2„¨÷oઢ½u;qã­nyÉÍÞžiû°Ùïû{”asG HÛ*¨¬îª‘èâl$€aÒи8‰ª†k ߯¬±)Ó€N½ˆŸ{Z$d¼hüQ{Öoc HÐÏDLþ[-Ká/ër#»$^ËùPH¤‚€T :¿Óìàà—•ðÏØÚ gÛ?„nÕ@$æÕ˜±âDåY ]6wŽðAAiÑs¸I H‘÷Qfê¤u”¤É4 xö_Ø.³´Û¢ Ì Á„!Î`&)³`9ÏI|•HòIÐ ‚ zÐv ÁP¦vøä¨$Bb÷Àg€˜õÐü¤yïölñMm ÏF4ÎR—¥"" d'OkWTªH8;ÁXAê¬Äǹß/ÉÒÈ.ù_ÝÓµ8v¸§¤šŒs,n¿Úz=B ªžs€€€ Òk}·¹=”Œ;Òþ{˜ØE»«Ðuä}v?!£m‡å9:UUUUéêv|„Ç >* …Pè1Š Óm$7@ 8‡ž¢øþ]¼O­uíí»Õï’YÕ7cßo]1œ<Ùü7¾†_÷95¯½íØÇ‘8þ⯒¿®å ÷§VmÑsýYýû­gôOçþ·ÚÖ©40þãfñÿYÍ<%wÏÑü5¢Ë~«øïò¯ÍWP‰Œ¿-–'|äDˆ…"ÿ™`ÖwJ)*·ãë÷ÉvþQˆÉ*+ïØpUøׄD¨ªI1ôUÜ•'¿óZÜ—f͹ÚkYç-Óä3Ì ×•… ‹¦¦8¥ÂKqyn gLÇbYI¬¾K) )¾8nÃŒ¿+³2ªª©*Fþk¬¶³¬#vî‹»ðå÷ýÿ|çÍTš*­®«ÕÕ‹¹$’NñÖAA´hS¨uh 1ÌN¤–'LsÊAå¿UŒ|èú ø:X|l>Ðx3 žOg3l9S†Jy?F8WwO$ìÅV‹ô~ÍË'æz©Üîú½ÌcÍŒ}ÝßW*±1Šª®wvÛUa>Ñáá÷cÝîù=ž1ÝÓÙËæé÷)]€ˆ ‡ 0² á€Y‚:!ƒ ˆY±G…Œ€„aàÄC1²«‡ Všrá·ÝŽ\œ±^OG›æró}œ¿FÚi¦1ŒcX§›Ñú<˜åîcÃlp¬Sæù¾­½m·Õ÷~Ñú:tüÅWf1ŽÍ4òc‹ñz6Úªªª«è~JR…)·Èø*~'â­4àÁøÓ†>çg,pi?G£ØöräÑÓ†ØòNc±‡‘ñ0õ;›§bŽ‡©ùž 8:G±àèùÑìr|θ¢ ÑF àÙ£ ³‚Ç3S‰“Rš6hjjndÑOÌ4)NÑÁÁ†Å)ÁÁ…4häàÙ÷0ääraO#Ðó>c“ÌûŸ¡³SFŒ˜a“ )L(ó=Ðò0ä÷x6aÁL(ùŸ3êlô6lÙõ>çè~‡ètt~RŒ0ñ£G‘†‰øž†Í”¥)JRŸAùQAEŸ#æÈ|àÎ;Žïxòîãî;ŽùßÈ|žCË»³aÞg¯¯—¿‚Ú½°÷®ß—íÆ733s–#‡^NÅx»©&ò§Í´ý»S«^[à2ªQQ¡ú·Â”»* ¨ic¿~ø•WËÍêI$’I$’I$’I$’I$’I$’I$’I$’I$üûV®áÚ zÆhq–Ê Ø}å=î¥)“‘¾˜|ãêkü׳ÝøÛ[m¶Ûm¿(÷AhÑm¿$ðüÞséç?9éÎ|àg9îçÍç=~ÎôúùÀœà9ÏÁÎó_¤û_W×|°î ’÷­ N‰Dt†Z}_ÔÝ ’èÉÐ >-#£@WwÂ8ÏThøGðM¾ë&›IïðôXjŽ~MÉ‘ ÓΑ`%æ_­r삈y3° ãÀõšn¾®™“Òî ƒüîè+læØ›êèGúÞÚ…f¨[g%ÉEÖLJƒ0ó‰¿ãÐ xè)EÚƒ60ÜùŽ¡G¦AºI 5šÁõü«ÝéÊò…Ïè ßeV¯…VP `€1´ U¥}м¨Ç>"DNØ°•±Q]ap¡ÆJ¢ð’€„–ÐËÉT‘€DDD…iÜ÷g+±›&Žvq¦ íqœxq‘bª¤øxPK ÎtöžüTº¥¼ã¢éäI#¥³tþy9“˜S|NÙ‰ë8;m¿Ÿ³Ú ¬¸ŒÁ Ïïíù=³zþþüP&Ü0åµÞ´õú‚rzô“5"_ÃÞKKç¢FT“Ëû5AØ9d8 á¯l‹*›z»úN¯Ÿ"Á{9æ¼®é4uªžçÓQr>¿(ÎñCãÎû_8ý#¤âÏD«ë’›ÉãyÆ/ÉòUUU[UTBI)žû›ý«  üC¤!ÅFËêSûTo= A4°l¯u40•ûÔ@ˆ<Á@(t:Üî쯗S"Œñéöuëtý¢ $Àe¶›†ñ±³5±$’I%²évnbº0ÇÏN´F]æš÷VÛ^&Ävþ‡d÷~=d›7S:÷&ÙoæYßzÒg¶N=Âh¬ZÒ–ñƒ7.T±¼Ö‰–®ò¥Œ([Åp¥ªþ\^þ„kש$ $ $ $ $ $ $ $*I ’B¤$©$*I ’@’@’B¤©$*I ’B¤©r$…I I I I I I I I I I I I I I I I!RHH’$$…I I I I%ID’Q$”I%ID’Q$”I I%HT’Q$$$$”I%ID’Q$$$$”I I I I I I I I I I%HHHHHHHT’’’’’’’’’’’’’’Q$…I I%ID’Q$”I%ID’Q$…I!RID’’’’’’’’’’’’’’Q$$$$”I I I I I I%HHID’’’’Q$$…I%ID’Q$”I I I I I I I I I I I I%HT’Q$”I I E#¨¤uŽ¢‘ÔR:’B¤’‰$¢II)E#¨¤uŽ¤$’‰$ $ $ $ $ $ $ $ $ $ $ $¢IIIIIIIIIIII(’J$’‰$¢II(’J$’‰$ $¢I(’J$’‰$ $¢III(’@’J$$$$"‘Ô’’R:’@’@ŠGRHHHHHHID’’’’’’’’’’’’’’’’’Q$$$$$”I I I I I I I I%HHHHHHHHHHHHHHHHHHHHHHHHHHHHHID’’’’’’’’’’’’’’’’ÛI¶Òm·Mvv»;]®Î×gk³µÙÚìívv»;]®Î×gk²MvI®Î×gk³µÙ&»$×dšìívv»;]®É5ÙÚì“]®Î×gk³µÙ&»;]®Î×gk³µÙ&»;]®Î×gk²Mvv»;]®Î×dšìívv»:k²MdaŽ¢‘„R:–VsxiB™œ6Wgp×°¶ø ØNêXa‘ å†5œª«Œ›ãG @owÔ?G·}Ëñ£žüÜŠôn¼¾×²{{øöçW§Ï8“îSv6è"ž$’Ij’½ª12d¨{Ótr¯ä¥ñí­”k\ÛÚfè”Ö°íóvb2%·g«ÏˆïŒ<Á u}÷éoY:ÐYÒ‚ƒ,Ž¶cczÊ5G3qã=.8×4!§£¼x˜ïz¤‰_.ï™®ÿ¬Ï:s¾Þ)¯š 'ÇÀ{›mK*¨­#Á|¾:-qQ¾#‡”s\ï"Ò÷Ø\×·ÐàÁðÄ´ßF| ÐBuäËP*ÓÚrÍÚ3uaK¶($Q|×¥Õò£|ï´ÙœÖù×8#ÃÊåïç÷Ná A˜#´°e…@ÄìP„Az‚ê(› )¤]Fn¬SR•"`Ùqª‚qÍr† 355ªêáv""" ZÐDÞo£Jæ®oA°æ'­Eñ@öÁT`T.FÔ ˆ`àÍUKÈ­Ö,í”qŽDN°Ž*»–@E>ù$Å‘K瘩¹‘3d”¢ÑõÑ_ÚÓÑr¦\`̪®A|eQ÷•ÓÛ”ix…Ltløæýѯ=½z<Ñ QY”Ð1Â&0\Ñ7¶â O~w æôº‘¯oñ°ÌÚŠŠOJd"B‚Ë MvËT‚¢tMo#-¤ÄçZ#ù ’>ÙxË=³é qúšLÚ8K*­Æ’úi9ÖþÞÚq³éçëo&gðØ&7Q=€ }•A¶^8å«Yna–oH ÖksÊ>:Ûnj¥‹éùjø6e·f§¬Ãöö§5àþÿ·øô¿o°œêT{ ìr|÷ˆ^Pª§­<;û{÷wï¤É}s­ “… —I3AµÆÁªÜ¥v=¬ µ#PôPPd}pêŸõV­$’Ö:õ¾9¤‰$‰9Iõ6ÌÒXP–öêó6ÁvæI¤I„UÃѬ†ÄÚHli'gÖrQ¤T7ò»¢{ûÉ$’bÚb$¡Pjl¯ŒÛ~ò^<5Ñfà ¯?:¯>7ú÷Þª¢*#“»§¡E77)r¶Úñ14UaK`±­Q±DX”D­ASÓÀåûnNO=ö^NÝvÉú¼IñË®ýO/-½ZiU¸Û¢!ÚC/‡®:;ñCت©i!ÁUIÁ=Òtö—ÐðþmaãðŸøùØó Ñå°"‡Þ USà[Ÿ“FfžUTäwô£UWù¸ßÊ¥æ¼oœ4•ëî‘#õýyê>w/Ó¥¿ƒ*y|þr©Ù­Óy žïÛéèKé4飰’š‚@s½ä5¶9Vžhâ§Ò<ýtÎðä¬WY#Ù²`È&e ŽÓA ½áCUÍÛp ÷òüf¹ã9×ÃøëÚœ«ùwuµôïéðÑÝôߪ‚ƒÛ.KT_IñgíŽßíH6 ¦ôä pB(ÂmBZ`‚îÑTÔ¿Ì7$ ù©<“åê„å1©¤Ël¤°­.ìïå¶9í>¨õõƒöõÒ<£Ïçåý¾:‡^gÃœ‡Õìã˜å“Ë···· Ï/ÕÑÏçÀ°ƒÎ}‰ð>Õûú>ÏC·´P :’h¤0ìù}ï€üxWñ-}¸ŽÿO»Û͉ëÉdj»¯µEe!ZøAÀo­‘>ç³P¸"„!ÍOØ@ ýIñú¾ñ1NóÞgó¼ï¿–ûï¿ë@í Ò””KRª|Xˆ¥–a  i#ìßK¤'ï©öÌ´f8fDÄAabKØ”àc‰™c„晎aLdÌ™l•sid ʆŠ¥…ˆ±±Š²m%‹Y›cOn"d¼®P±2URÃE‘ M1i†”Øi µÆ±lŸ’¬[Z\‘[„Ö4[j½ùU]QEæû¢€€ü©éMh–‚aÿ™QTYq¢HhUTìqDF ¤0ùûãºy,~8?0ø»É ªŸî$‘²ĈÿóIŸ ”Gê;ʼnøΊª›Šª’ª¤¤M?“xÏÚ;s©€Ä2#Y:•$Áéþ‘C%Òš¤© 'ÊLCó»ÿgLéÞD*eåò?î+TĽ›ÖàÄ«ç½nûÄý².]IÞjðýœuœÎØ—lµÛ5ga§{ºÄ›­èt¡,·UrZ ´ễ…ª´m~äÅ}Üâ\Ô¢Ä^‡ŒÖf®Ù¥ñgVׇZZ¼"u‰õÅ2áV€ÌÅ-+Ó'S=Ê—åþÏÁUcíÄÊSå6<% Têî¢Q”ÿgÝ­¾÷hI$€´[qT·:³WÎ÷YÍ÷;­kœ½k›ÚçXW™Ñë5ÙÍsS#–œvä´VM_{­õõs;›Ðk5­kW"ÌÖ÷ÞßyÕÞç{ÞÜ«JšÚv✼ÞMó›}æûšæ^»4¹Ý빫·/[åßyÍï|ç32s¹·z—9®én+æuæ¹¾÷c{5—±¬Ü©õ“M´îß/ÉÝókO*º¿ÅìRùWÇÀ $½ÊC¢5u»–]­]–^/8¹gBBhŽ„Ñ[Ò×È„!µ½À°¸Gˆ08ÏBhŽën¡(DŠHê$±&_R2î ®†€ƒk–tÏ7T“­ÜÎ÷Jg›Wqw3½ÁÁ®·w3ÒÞîgr;ˆæ•»Ò»Þ×Rίd(A>z=[{‰g¸kjÒª§Üñåï3ÖQí²†PŠM&AMg»ZÖÑš2VTšÛ=ja<‘}þOr½€=ïÈ!r¢Ÿ‰<ÊŸ‡Ùù“ž-·DúÅûP‡¿÷?_iïœ! Öÿ§øiïÖ¥TüŸ‡©ï|¤ôá÷èÓüÿIν·ÚZ¿>þ'cÇ?/ôþ0?þu!?ëAEdûO¾’êŸæOütÿzûWð$œ‚~“I&éþtÄÙ„ŸÚ (¤¡’H‚!è"‹QBFá9§+[YR+4*‘EŒLФԕ¶¹§ ”²³m™,@iÍf#BU (S*ª@@’$Zµl©1‘J•Í-\E)CF¤°YnkœJM³Q”ƒf• id%ÄÀ“!ŒL ³+UbL‹#5(VIDæ¹sUj Ûl T$Y•Í+”£4ÂÉ­6dH”JbFJª‘*ª@@3 ŒHª¤¡*ªJŠ­mf[m´­hd2M I"m­\×.&´Æ”jj¤‘\I ¦Tý‡à4›&6UD„…}è=žÿ³è=ÜÞÿ«õÿGS”þêtO×ü—ØOåDñÔš/òô¦\¥,”ŽddzÆ(þcØùÿf,púǼf«ßã}¸9 Áó”©,µ´™AAúY@ V­QùÄñî‚T­úÙÐ=  ”“ã³µÅeLãTúþ‰öqá¿òh‚iÁ8k¬d®3äZ˜£MÑAIïü Ën$ãõls¶?âžzævãú÷íß6A@§‘*¢ï¥Eþꨬ¤ ©)ó¿"õMxô»ý=EÒçÞ £Mì¶úªµ|üô=öSù»ß¨þe7WÞRùäPƒð¸Å=,™äo¯o\†Ê¸V˜²Ù¦×d\|áñUvyÍÚ8Ö[â~.´U è+¤V.?m¡!d-AͬʠfËYBˆJ¤ö— {ý_,å`Aëàš¹²„Ý’d;¯ê|D8)}h–BÄU^­‘ënEzvá§}’CÛ¿„ ”æ²Ò‹|­ ëÍCN¬¬¬f²?åÜõiƒ£Ö×ðöÉÊ2¡A@¼©3ñKòÑC¤¸´øšB¨ùݪ‚[Dl)×=&Ä—Be¸‡^›h¿ø—ìíï‡öŠöz¼+^Ë“37žÇ÷hÓêW‹:‘i^i£DÕ⎤šJAÙ³ýžjl”°ýÙý›éüø'–d¼¸ÀeTª£CçÆÖquA_Ó0í,ùiÊ%UéÜ€Ðvž“7®?š1߀Zý‘¾Bmн?–uOå÷;éýŸIô³Ùòýž×¯»éÔ|Ë®êS©N¥:”êS©›u)Ô+©¶»©µÍÔ§P®¦Úî¦Úî¦mÔ§Q³u7P®¦×7P®¦ÚêÕº›©N¥:”êS©N¥:”êS©N¥:”êS©N¥:”êÔÛ]Ô§SmwSisu)ÔlÝJu3n¥:™·RMu3n¦mÔ§SFÝJu3n¦mÔlÝJu)Ô§RMu3n¦mÔ§RLÛ©N¥:”êS©N¥:”êS©N¦mÔ§RJu)Ôͺ”êS©N¦mÔ§RJu)Ô§RJu)Ôͺ”êS©N¥:™·S6êfÝLÛ©›u3n¦mÔͺ™·S6ê6n¡]LÛ©N¥:”êS©N¥:”êS©›u)Ô§RJu)Ô§RJu3n¥:”êS©N¦mÔ§RJu3n¥:”êfÝJu)Ôͺ™·S6êfÝLÛ©›u)Ô§RJu)Ô§RJu)Ô§S6êhÛ©N¦mÔͺ”Ÿ)µ&mãiãjLÚ“6§SÆÝJu3n¦mÔ¤ñµ&mãiãjLÚJu)Ô§RJu)Ôñ·RJu)Ô§RJu)Ô§RJu)Ôͺ”êS©N¥:”êS©›u)ÔÑ·RJu4mÔ§S6êS©›u3n¦º”êS©›u)Ô§S6êfÝJu)Ô§RJOS©N¥&mN¥:ž6ž6§RJu)Ô§RJu)Ô§RJu)Ô§ROu)Ô§RJu)Ô§RJu)Ô§RJu3n¥:”êS©N¥:”êS©N¥:™·RJu)Ô§RJu)Ô§RJu)Ô§RJu3n¥:”êS©N¥:”êS©N¥:”êS©N¥:”êS©N¥:”êS©N¥:”êS©N¥:”êS©N¦mÔ§RJu)Ô¤ñµ&mI›RfÔ™µ&mI›RfÔ™µ&mI›RfÞ6ž6¤Í©3oORfÔ™·§©3oOxÚxÚ“6¤Í©3oORfÔ™·§©3jLÚ“6ñ´ñ·§©3jLÚ“6¤Í©3oORfÔ™µ&mI›xÚxÚ“6¤Í©3jLÚ“6ñ´ñµ&mdr[·%¹ r&Èä·!nKïè¯æýÜmØ«Çs©R’;7ß=/)vxSÁúØÍÙyáðJ÷úá–aácxhõ°ÍÑ¢jñGRM% 0a˜Þ7Š ‚BC,Ç›}='£2^\`2ªUQ¡óã G0quA«è˜v–|´åªõö…SÐ<ðÀy Þ‚áeG”Ÿ®+5qAx¥Áì"ÎøžÂZ©¢¼Rœ^%*–hÖͯ¶j9ùfôúq6å‡ïgÅzÚß«àË®¯¡ýmr§µ”*BSŒ ±lÕ’b¸¤Üz¬]î% 3(žÔól¼{$Ù *ÏœÁŘIe=?â'(C&°ðóCWð~d€$TÑüÈ(¬©ý?ÓýZ®v:Cÿ"aþñ¹†€ˆ‰Oô: &rx“Rî;78lï —‰RH®þ¯ýNM?ÞVÙ^¼”®\œ¦?å9rÛÓ§^Jå9q¥–Ïüå¤M8Lv¸{=qï ´ä<#ý÷“»ÃÕ檯6ŽÊäàâ;ÇwüÏW³Ã§ÿ%U| éæ®OøZ<Êî®ZRÇ¡,yb^ÎãÉ˳Ü{ôåÚi¦ž Û +»¼6Ò«‘Ä!D•U %UH`A%@ãOûÀÿ õŸŠŸ¬?‡äw)ûð']~Có þýI'âO›&Ÿâü:~tTüТ~¯ÛÀˆû¾¿ßúÿlNvž{ð¿Âb€ @?óßöoüGÙÙÕù/í¶>BN1þ¾Ìère–š;3üŸ³÷Cn›Nq9ÃO—>¨à=®ûï|¨}|` m:úðA`»È4t„¤0‘ÌÊ Ìˆ¤1²¿_íý›çZß-G$…ª<ËY˜;¸(åŒ TÕþ&ÔÔxªÕÛ´PîÔ"%°…ÝØfm£h „úóšÐQ¶ŽMqRÿ-1Ue‡9‘SÞJÒœ“„æefDg÷»3ñº€Ñßß9ÊG¾=¼’Ý};<<;û·îîóy·Ðvô¡6Fõg¡”Žº®Ý¾@Ì’ŠIS{ÝîipouíÝåè}ß7§˜O¼r:¾Z‘ÿ±K×íqÛÇÇÕ·V…¿žs†ÖŸ¾"†“¥V¹_pA‚°lê“Ëb¸áŽQ>>>Yœ\ß:ûí²ÍŒÙ£g !ÃÃà 8#ŽØîðèÙчG'GcƒGcÁàààìS±ÑØîaÜð}—Ñæï­eUgŸVÝQÈ?¥¹:±FëU‚(Ò0`€ãÉ•¤ j RÓ©«H›ŠÐ\wl4Ì–†ƒ xƒ1Õ4R#xê_€ P4o Ha#™”™HfbU„ –&(lˆèâ R£ayäzôS^ùX~ H÷m†$žy˜|“1Etn¨*¨ õ{ãžø¥r{\Òù&«{ÍÝÝßù£™Qh#»v{˜Ê”9”+ùÊ£Æ'ô¬Å£á6‰®)%I,oÆÆ©Årï\Õé,J ¤éªÕ×#®VÉ\&¤཮;Ó]‘ÝåÔ„'<Û{ð²Ö6í¹‘G9é5 æÍH–¦…w«‘»½ÍÕaZ5U½éjõ|K-ÿÒzÒxãšß.n¾¥1òá±u÷pά¼7ëÎ\ÑÓNŽ]ùNèèH/ùÁðÿŸåÝG‘G»ùúžöI÷øiDfFµ&”F¬¼­è(¯qZ£{Ö†àïbœÃ`JXﱹª¼¡þ´‡]9³0,ÜEiT}’«îëÕ:Ba‡1 ’u/¥G[<ºþ×Oª™!(£(;Ú=Çýú>í,̬†ÂgP‘;wí Ç<&‡ª4ŸjLCír#¤æ=y>σÔnô3Ýý@qÿZijß lƒ2Áh5ºëlÜ‹˜–³&FôÒW™#Í`¡ËÏåçíñíƒ ú4£ÓÏ舵ª+ZÎbsœç6’of÷½ïrµ­n Ʀ°Ûß{Î/;®yàü¿<í¬-©k<çg‡“ÒÖ¬¬-©[<çgóÞÎMë¼Éß[õ­EÍ󯾪ùÏ;ÞôÎÛîyå¼ljó >yç8¼î¹ç˜5<æ÷“žy™ÅÍó¯¾oúq%HG°š†š¤ÐƾgØÑIUTªGá—ñ}õ#ñ°å[ü7Öof¯Ð¯Ñׯé¿»›‡9Ì8ÜFJqïïÔ”Õ‰SIdƒ)B JF¶2"%1TBÀ (YY(‰²Ø‰²Ø’‰K-+IKJÒQRÔ²±Ô­DKel”¬«2ËJÒRQ6¥µ+iVÓ[-lJÒ­TµD¬«-¥DË2ÄÒÑ2ÄL±Q2Ä”¥DIA†Š&‚ ô¹†òÖm†2‚“,´Ènò\¸]”“M¹(‘êQhҪ̻¸…wEª©Ñ™s4¦¯Fê•Þ˜c EqÉÄPâ]W ”+0Å&kL´S,.캱Bª€ê †!·P)Ô$¨‚@B”Ø)n˜ÅU”…”Þ¶îæ]·ŒM¥8c$PaŽkN²¶cB¶£h’ȬѶaAŽDÍ:2 t)9 ƒ!¢$`€P6‚¨¤`€"Ë·à»Î_0÷ü>Ž}]}x÷ 1øuå™Èe–ZiÝŽÌû»ü!·M§8œá§»ñrÀwH€&d)ˆ|¯× ø ʃ쌜̣> SéQû6àž!2²L² ›*ÀŽ#S™–a£õû»ûnzuŽÞÙÎR;#ѽ9uôéÌvõ•<|5܈gŽúݯuÃ,š3îE™BJ…U!I/X´XÂRËjøæÝ’DZøêä~½Ð”²?‹Êé­¤¼<<û oå…éHléꈡ¤éU®VÁ €(ÊŸIo÷µð†Ã|Î.o}÷†›4lá„8xxa‡pÙûÞ9::9:;;bŽŽÇsçƒç:ÏõkZõË%Qs ŸÑéƒí6SPŸ\P}èÉÌÊ3qÖl ncûK×ãOj˜÷^Þ†UxòëU³†·t¼/8‡èùÃþÂüþ J}~Þ¤kÛü!±*drþ¤^0êP©&ÓŠã_Øš8ÇÞ£Zÿ‰&Htúâº(Äÿâþ*ðüß61ý­?Ö?´Óú_Úðö}Ò}}þu&Þq¯î†•[òx‘øÔ~NÉ—f–ÏG¬vê5‡áC±ªŠŸÑÚG!ÝðtŽÒ¦¹Hâ M!rn`“ðõäþ ­b/zuѬJêF† <Ï Ó’té:œ#hÔU4¬­È}ì=*I2•)‰ö=جWCiÍG:Büßêyƒ÷’!Ï”ífŠ—.AçUt±qGâªb7DkÏäöü‘ídù´UžÏt¬E­aZÖsÞ÷½É&öo{Þ÷+ZÖç s*,ß<óg­äëk ÀDiZÑpmµ¢æs´Iîˆ"·½¦ ¢u´\Îv‰:%ìžLé;VØaCMó¯¾Ú*U@Ê7¯9¯]o^½g‹{ó&²9QDLÒ¶˜´âu´‚ €Á <_ ÖØaÒéÏN¹×¿Ü~sTU^ ž9…¦Ê­kE¦É³Y•òŸCÐúPÅαøGga6õð~èØxŽ!CfHúÀ ˜—dÑ4—Õ8凲Rþyn'ñc™Ï·^H}®ðÌÕm†6a†aúQ}Çï”Ó[“zœ«0ÆÌ0ÌȳŸ§fyèѳgÅ/|t Èu¶Q-èL[sR'âÖÓÁqñßÅôöêOz\dÌÅ\ÌQP¸kËÉÝÛ½Åf‡hþþä{¿ƒÙü“ù'鿶Ocùÿ~Óø~Bc‡Ióäè'bIBñêýH{p[ÑP}Çóˆ >$ý=èõÇ>@îS?”ý:¼.c3-¹IñešeØÛÍ>%J}¤ÑúýC Ek 2­Ä?=¡‘$5» Ô‚Hf¬¸D„kWD&ÛÌ\ÂçôÇ¿ã>Sò™4û„ 7ÁØ3AúÑ»ÇíöqŸÑ9ó¦ 3{3òÜ€Ëæù'? „fñºhG˜A@`)$¢ªÙ–`fgw‡§Óèç×ø=ê=Nè" ì©ÌÉTª¢®>ÎížÄ‰h‚#ažðWVßä‰ 7¢ Y(@ªþ:ìô¶ŒÌcÁƒüº¬>+â}…d]*,²-¼)Iî½Ý*I¤éñÅyéwÖ€wúýd!õ"{EzoÏͧé^K ²/#ŸÞã ¬“®³3ÉèhZGÔ´QW•ÄY™†@è2ébÜan™8K*iä•áû_½¶/ÛÏðIýÀ H¨€ Á¶Ùþš0Σ÷Òâ8D;þ]Ðjbß32³3ÞµLQZÌ̧çùN}åK¹×9™•™€b¶Ïɶ»áòý‘½ý£ëÞ8c¼0>½¿kùGnÊ=}c0ec)¬ËpŸ“V5šžî<ãÀøõտ͹õxie$xs‹ë™¨ÄuÎ<¾¿×kì¼v›áßØåúÒžš²guï¼±R•Vå̬IIŠw±OO¿ob}c‰Ú?Q²}#öEŽ5:c±uBêŸ] T V(ŠN:öì(§ ŸèþÙúDþSûDFÀŸÈB¾®JªOö\?äw®åð´ì”áÙáá§eQËÿ+ýæÏýôŽ¤å8;»¼›x{=Sò{?7Ùöz‡æiÝÞ¬Jû)^ŽŸ÷ÝÜááÊÿìÓ4Og.Xöxwz+Ñÿîò4ø½ž‰G£à¯7gu|]“³„û´ÿÒåŠòry@d’Iä‰ ­«œZD•U"Ä’Ýg5 ç76ë@âJD„֮渠ºosp&ß¼†ÔëW]o³€rƒ,¢ÅPª¥KmDÀk‹ÌçväÓ|DFÁAÊ„øÊÎyÎn³33-™æ"?xhdõBúÆxÞõFw1|î1í¿sG7ŒÃˆÒþî#f£ œP5y¢~"`™ÐQóABzß+»ÇB¡R‘Ì222anÝùœß¸âN8÷\<$ïKeà··[\Ñ™U™¡Yc*ÄhÐa…V9+fÌ&Êrrœpq9K5½Í.fg€šPVL«ÚÜ3‹5FÃuR ª¡ù¢‘1ŽÌSQp0(˜6S•zÈŠžæˆ¤ü}’nH &6Æâ© 8£I‰""I:\ôév" ç*j”Ъj!¬” 0$¥Ul(æbc…6˜Z¬T?óͼžI’äAȉÉ$Ò]jC8 ‚ ØÓm*Õ«JJÔ‚É;ºzÕ嶲§”¯•WÍUÞÀ’ÕôH;äYKe J{†25,°" 4ˆ`¦º hyâÖ*œ¼%•e*QIî÷¢œBhœF¢!*$bCÑcSˆá”%Üñ_eÉ%)R¤´”’”¡†À‚>–€&‚`T…;>Ë)I5D&ÔšL‰›m=dŸTw‘<â£`Èð$óÇæ¢JSÖµ|ÝéMP€zW²ô梓m³Žlã%”®e*Þ/”Òm­^v¥­+O ¶¼–¶R"6؈ª_>´žaÚw]ÌÆe¸Æ0É“f%UUÌ31˜¸\·#1ŽñémU,T¶­«m½0‡`†$rì±h F! D„• (`˜"a&¦‚ØQÐ# "‚¢rD¤É#v,,´,´²‰Â$vG°–Á@²„P‘e ,BY@T R4$MRÈRت-¶¢Õ©Âm5âF‚`Ô“É$ˆTƒ²*'pÀBçÈF©qFT¹íÓtTHSÕ6‡\fÞ£[m±Ê¡ÈâF$yÈTbEI Wš,ÒÌ¡›‘ä2âåÒ`Š(H»…ÛI93BÈJ f¥”µ0Ö+²04UHaR…­ï}¸ÖÒBA%H¢¤YR-M^9o™7Òç;¨Ìçm8Æ’w4hÉU #¸jâÕÒE`VÀ=À o†ê´¸ó‚”æïXò¤u-e•W–Û[æ·Y­­ôx¨§à¨¤OT"-Ï?.z·‡æðmÄb,°|³" `¢¤¥“5òVѾ©ÆãQ¨ü#Ä{ÆÑË·g&ÎëÛ[¯·²¼úŸ¥p²ÏpÐx/%£Î¥HéÚèhÐp‚:iµ;;ª¥;Ó¸äävâÍ(ìw”²(î㤞–;„ï#&mÕ-ÑM”ª¾*¾ÐÞ)hª¼p©¸§úÁ: ¸à)&ç QAiÐZÐ*‚_C×Q¨±æ¢8!>±Þ4“ï!Qé!èIäQ,B ‚zê˜b #ì0‡Äª-µ*ª’”¥§(‘R!‘%E*U…,UsêR•ñ•UB¨*ʪ¡T!’ñQ¨øÇÄ‘è ‡P€` ÐR†‰ßYv.DH»«‘8(f“yÍfDÇJ•ÒtÛ§Lt§GE%:'FçS§XxO Gا‰(8’‰DŠ;Ç”gÁ#ã#·Pwòßh—§=¸‚ªÚÇy•M^òÑÞ’½Mo7V¶â[ÜÞï°u34öÖÚ¨ö•äÖð‹NkuMÞàP²µ™§´h6˜æ£îI4†Ð"ÂOH×Á—2©$3íqŒ®P¢%Ž"FA  4jfi—Y—XÌÅ‘ÎA’OHÐb‡i#Fˆ²"I÷$}CÌõ’;’9¶%Iœ¤<â¼£Ù"—Æ7Q­cTåf®µ5Hq$È©7#L$">–#ÙñŒŸh߶¤âMkRhÓM$ÐÑ£Dš‰j·qð’ hQ¤ØYâó…ÏNZÉU×WyÌï.å5ÖÛf]§n·¬X·&ºÌuµ]§ ì0!w*ªJªž ëó…ˆ ¥‰ V€è •N,’IŽÁ£ó†•$5éUz[\¶•å¯w¨$ÌBÕÈÄ6ÞaOj’;…Lò÷žŸV»¼ú¾º~^ÙàAÃM8R±¶&ÈÐpÁƒl+¦´`aËmoš;<æ®W„À©æ% …ïã}ÑÇòwòòns¶mã[&·£·Þ]d?Š`PhE€"Š=C§<žx•/Gœ˜M‡€QH!ž<ÒU&Ï<ð¹ÞÙ¡²¶Ö·£³¼ÕÊð ÑT"ŽÑÃÝxi÷ÁVƒ•áEY•éøD¤"±?œ~q¡dªMí$”M¨iä0ø‡¸è(ÐtðùBÐò~RÈKH²TývO‡±ù"9ˆ„â;Æ ‡€œ¢GI$'âB=’„`˜=P‰ ®€H„B’! X¾ÄNСE‰ »¾äiÁ¤yöZW |2Ùf²´µŒbÖ0©“ Q©‘&%–K,ä²$K b¤±QŒZV\U3-bלóšB‘‰<Ä7oÁo¨owr.\¹rI"O˜’=R*BY'˜/7­DA!Ñ6IURÒQUmUÔƒ®É>Á\È“²–R¬¤-YHWªò DŸ_‡×é¦a³m¶ši¢ísm´»FÓm¶µ­k\ IÞ±ßÐz%˜‰$ª‘£ ¨kXiI¡VHf±—3çšAä!ç ª|žZ ñI]€Ô D )nI¼w—nn\½×æ@’JR”‘I€JPB ’‡.ëÏ_EµÄ‡Æ›H’L„àG1 ÓÂh^©*âbtBÞˆªª¡ R@„íµ«–øûS6$¢$¢H‰)JŠ1’ç9R•[-·­ë,·Üˆ‘"EJ2ÜÌÆg@ò$uöD–˜‚(yQle¶L²-˜ˆâI†4Åc0ÆwIcçR¢K˶W” íl„S­²³ "0ÀÀ‚ t.ÚáW¸e€(RX… !B!_‘^äóôwñ_R'zp“Š0 `1€,}d¬À•9NEäÐD"n°XÌ')’IÄ$ŽÕR<ÑÂ9‚HœyT*ÒÏÔ~ ˆà±ç:¡Gd‘÷dCê–<ä$šHû=’Hn¸­”²ô4ž$ÀbY.µî.->[G›Î"È|â‹qïQRB>hCIC ¡êZ欫߮]ʯf HNURÚj–BÖ¼|«iŒ¬”nèðTªª‹B«ïè²pÜèüS>m YUJTôªÙ#{X¥ª¥U¯ŽˆAIÔiFG‚##ÒD‚ö½å¢¨¯|êëžâD’„ @> êM’@§šv Ä„†OOkÒú¤ ‘§Hf]»Vc´v¤GËÕÑRI •‹ ˜(ÖˆU˜£a†FŠæ üO1®~’¥WàÊ“¡¢}À¤¡êcâ?b]⪤` ŒD–e&†A$2Ü‘rÜÔWÀ(>aÀg¤HÒCd@Cm—Š¨P*¨…G3qDh¢.qͪå´ÚkTŠ"ÐÕM¥r2O[ÇÚ\d˜|HsÓñHÞlM¶*b¡ÌÒ*PP/©šDB1RC>ßÓ¿_Y½kW¬Ñ¾¢!TÎ÷½îŽ†Îˆ DRû»»»»“¸èîQ©EÊJ ×kµÚíkĽ›¾Àõ6P¡‰$–Ü-°¶HRÈ B*|äPŽ*ª: Qè r¡Dù“ÒŸ"½‘#Ü=$„˜Hð˜H4‘aPñ}| ,N"ÇL‘!@D†jiYMkæ‘ꇚ'ëš[UE4Bb £^—ƪJ«Ê¤|_0ñà¥-*–‹J§¸z'Å#CH£èìG’Õ;,ª¹‰ahª²Iráã5m¡,$hYBª°Š*UqjåIlE\äAkÙ¯¹,¥ˆˆˆ¾˜´‹´FÓ­ª­vU¥Qf1UUUí@£sm™€¦,ª¤ª©ÅŽ!ÀÁªª{•U0U à<‰’Ä2B"A¹%ŽÅWÌT…P8êˆâž•_AÜ‘òï ø¼¶šçêø9ŸN^Ú|µà’´u…¥«S‚µ-±¥JØ’cÇŒ˜y9ðuâ:T^UP>—Fm›Â¹ç„<[Ù¸Ž#¦Î÷UAà’ 0ódHÚ¤ùÏ<͇•TUxIVƒÎXuðòŒ:Y“|9]G€ÈÒ6©#Ro¾yz{@0AïÕV¯£_vôø^þyÝïzê{òÙVËÚËX³ß’ÎÞf¼ò®ªí¶ÝUTbë £‚«&¥4››ÞïP„!Þ˜ÛŠHÚ«Nä‘‘IBIŠ6G² ìHæH4’*(/ç‹)µ½½¶¼ä„d²”ÖËZ%,«&¶“mKRÚ‰PùHXHxlt$C°rŽÒÉ(=¤dŠ‰„ˆòôâŽñ¤Ž¡íã×ç½ï{ÆíÝÚnî]¦Ë,…–!Œ,, XX*åv¼pIJñjÞI™!S@$ $¦€HEW‹[s½—wvQE©v]ÝÙwvI"²ä°¹jí[ *¨RÕÚ¶UP+rí6Ë—nÓ/ZÙECm³[mf‡•:¨*rŠ‰:•4 ñ€ñî ÷“M(>@âxÛï¦"L±EQe‰([D®wawvíÝËrÿ*/%åÝÝÀ 4 4ˆØh° À¡ k7½è%a‚`Q„P2 æ÷n÷½ë7½æõ¿i!ÔD‡oŸ²™4U$É9DØz‡Ê=‘¦:ê®ß<©¡¨#rŒm­«æ%4Ò€Uëm{ij”*E*B& È„TŒ*E L'#ÔEG¤‡"ªžÁUMÀ1UTúKåñ(¢ ˜tæ‚£†EŠ– ‘`…ÆM[$æHŠ$"#Aƒ`›ˆEÌóщuª„H—{¶Üû=³/JÛm¶ÛÆ aT<¼¼“ºo=-y·¥¹‚’Ir9RI$!"RI$Ÿ:5V¯[yOR™$Ì’©Ëƒ1Á’–1C#~55GMiM¡É\ p…p R·|ÓqË8Ì)4<œ­’ÖÃ6Úò»mwµ*ŠTZ4ˆ‹,„Èà&ÈÁ*Ad2PTƒ0)„©Ä$ÒF+ @ˆš`DIP„€&IœÆä;ʼnÜ;¤s$’DQèõBÀàQsò.–íïŽð·mÆšhÒ4hÐÑ4Ÿ^­ÚrÝD”¦¢Á…P1-Hª’JPé$M¤Ôtˆdˆà0‘Î<‰’¨9„ÁØîí$Í“æøscd¶R¶jj¨*4ÕX[d« Icô ¨FÈ ¢x ÖiÑ=’â¢:Êp(̘{·Ö¨ h¦!‚J)ª¦Š• ÀS99LÙ—¨ž<ïa7lÄK6î:ŽÂüÃÑ8v$ â4ÆA:OÀíñIBˆv PNÚ’¡8@ò‡tTRu‡›$ ò‘óq°ú<Ëp’`•ÔxNÌ ${Æ¢ˆjHb¢}£åõé°1.„GD„”K%—E²J#Q¨Íi¨ØòŸª_ÙRDý¿Ÿ/¾c)ã7ñË~³}mb°£ôàïZÌhI!ffI%¢îârÃj®:Ý»HLªŠÃy¥SºÝšïæ”k¾J NCZל¬óaåÙÎs†‡ÂË8p0+À…•Êår¹žsË- ŵ{3ZË»¹x&fd/aŽm½ïM¸_Á$WVYb0>}¨¶I­{/§Ø$¥srøér«¼ÎpDNÒI܇p¨h=$‡ñ¡ñO®;${BtözÏ[$Cab–$’L lÜ S‰!óˆ‘?ZGóAH$÷HT„Ä‹¶ÕôUó„”ЀIóÕ*ûÔA¸DDjI}CÔ$xHÿdòû‡å‚&=âƒH܇¢´H²$j?ƒÑæ¤}ãÔÒyà D²(§)"'™ÜóDõ¼òŽR<}<‰¹Ï•s›uŸ }9H僙¢FܶÑT˜ÓC£ixq¶¹çZë;t‰ÄŒ[Þ÷¬:ùƒÁ…Q´Í=f÷g,Ù®¿–ª*¨ºÎÊß{žs¥G…Pï9Ý>ùXcavNrN>t*»EP¨UAWZò/Ì9ßžsË $,’î„œ¸,#É™Wywˆ»¼»»—‚«´°¼Æ:Nf[|8ã7í"²Tè!B~Ôr„‰41ŲÙ"¬T•Kd«¡ƒ¸Ì[mf2LÍ[xªò¥ÓÃàÖ±}>HÍ8ÞøáðŽ‘Xå&á­a½Gãº3X“oCÄ®ËFib5ii¾u‘¢£"Å‹Å–8ß.ºvóªÚ•"×±®bÚZÖf³aÊ/š¡©R-p×3 (³†Š1ˆ…BåØåÙÃØàtFÎÇ$`íW Õr°3š –$›ÅÛÖƒa¢ÕwK€UßÇ1p3w±$ß–ôæM¹ß+ng-åö!ýt‘ª$¡B§1!H¦éÞ©²âvã¾ÍT™"RÖ,È1Ç S‰–at1…ZÊÑutÅ1$–GÅLTHHDZ„Nä¼óz«ÈMªªª©‘ÙÈ¥‹à'QÐl*'·±,¥ƒÅW­ç{0Š¥+Iiúunµ/—µºšÖ´ši¦‰£SSŽ6Ì·ÃÂbå²\«K‚79Îp”®\á9eYo‡`ù†Ñ>ˆî#a4DÑ<Èr¨â$¢¾‘à:QR)#Ñ Òb&’*%yÂbG™ï••UTÁÕ \*Œ*Œ ¡—y)I(8 fA‘„ŒN8ãLÍhºÖÉ„Þ÷¾Û}ˆ‡„P,xúñ#òðúð¶Ù Hý¯5‹ )@¥*Ars¿–˜fbˆèç$ êAêy$ŸLmyb’œ! „*ª‰%R–Ú«j­¿0»›ÛŒÖ1šÍ­fNh0Ö±´f‰Öü USÞ(Œ?M¿ A:0¤z’OB$ðG©"ÇÖ,G(#Þ8 MD³NÅ¡hš|Öh)dDŒ , ¸ž|s`CA9bì{…’C‰h9Ì ‡põŒ 66‘9‘HØé G„Œ ÂGBЩIåA÷þ¸y?«ö¥ùÏZÎTC圜â\9¬­Œ6C§J®Žœ¸NŒ::)N‡G'„ð‰¨ˆ­†ÃÔ=¢"FíUçàIJ™a ¹p2Æ` aQÙPŒr‰°6†¥’`.K0eˆ¢01ƒ Ê)œUÇ •ôŠGAò:švDÄ&DR 'Â4H©# jqú˜rü'`gå£Ä&Áî‰1#ÕßzÖø³–´Ë¯<—·MrìˆË‚IAH[$R¡4‘9sÒã1vtŒ*0Ç2µ2oMqÃ&•¼ærb ’JUUpЕPJeài$seݺåòï˜Î@tQUG69§9íÇn8監•Û´ÍÌ’I#™ Ð: 5e¬ÛVºa­h S€ECu ª% ’‹Ê²S5Ã\Ù½=PU€!îØ`¹³.ß|»Þq ¥N®›i[Îg5¼Â!Ñ”ÜäˆQB«OAK*•F€$.‰±ÒyÂ8-rh¼À ÚI)…à2î¹y¬ÌÐL½ &õm*ºJ®<&™árÍ ¶´–ýª¨*¿` ¨LÌ0¨ƒñ!ãÎà€÷sæÒ4&‚w}æ;áz¹;n?‘ÏÁ#’uIq#ZG~íNŽ•óxO•Ù4' Âfîî„õ{žót•WS$À„ ? ÙJ&[øÀ¼’¹¿U)@”LN8¥È@ÒÆŒ¥Þ•ä—\X%Á Šb¤òy<œ^NSȧ‘àžE£“ÈìhÂ’ySÊpNg”æñnf6{'¿¤œXõí;V£ÆGíçÖc‘¢xIj:’DÑÜ>ĉäH©%I),*QdTQQE…%ˆÒ›,³M5¦´ÓL̲•*iL’dе-±¶›b…•…•”„ÛVÛm·âöI¸`<á=ªà@P+èq 'hòŽ’I#Ñ‘"Á=ƒf KN#à’B`‘ö ƒÐ(òA¨±Ý#ÏÄ@OI$=Ãq$‡x{¤O4i}"–BÕJ™!æ¤ÑR¤¬JD‚JIEÎ"Å“†!JC$¬*B”†„A$e$5$’N5MkíÒD”¥DZ"J%V$ó §œôAÊ>‘S,Ë–ª‰ØÞ A Ó6Ø«aLÍÙÈÙU SÀTwöû3£ˆ“+ +)«½ÕonÚ÷%(¶µë^ÝMímIm_0Æ™y>KLÖ˜ã1ƒ)Ò-ZqÎ7e»¤8ç«&3*DeÊIƒWV\²#TŠ‘¬kH k&\©¤ cU«-–żvô+€Ôèn’Ô:DE 4³@óT&£°`N¤ˆ¡í$òŠPpYDÊ´[2QJ(¡D,ƒ*ÒÔÉE(£ä5V–¦¥BŠ(YE(¢Ä„¬2¸ÀA.E42*5«slªÙ•)SiR•*Us6«ñ=bJRÒRUª¥íP± ýô‡aR ?™{½CïäüŸ“éð»²ÕõÇÏ_-|u“éí?:.Ô‡Ý!ÙØsªKy4„ILËb[~J{z­¢Žùa¥é{ªÚ(ºÕ±õúŒëguÒzÏP¨ò½"‡êÏ[ųË3Êù+«¿å¯P¡ê®Xù… ÏŸ¤õ¨Öü»]'§¯¯>œÏZØ}ø¶ÕT¤^QSÔ-{xâ=6zö9íx½—#·ÙO¤¹)wFæâ0@‰XµRÄ ‹a{P=‹ýµëÀÌ°Æ hÃدü…Q¯¯×¸EòI{Eyd$ŸC-‹ÆIUUUG¢ªŠ¿™© ÖkãZíÚ²RQ¿4j v4ÓšÒ²RQ»­h«åUõ£´YGÜQ•Ú `uÝ%âIžZDÆùï¶Ü3uU¶„CÕW*Ö4"f’L¼H˜ß9¶Ü3uS¬ªÆ›UVtªiÃéÓ¦1:I:b”ÃFÊR˜6tR¦Ž&L:::0à ‰'S")± ÉŒÊ/:‰D¥C¯|ç¹ëy­ÅA\¤’H¡8’iµëÇŒsãÅb®ùçÆøæ¹å#÷Ô’q$‰¸¨HŸÎùÆ¢#dMr¡¢BÙ ¤ÔÐ4(hdIEj‘ú{¼ìd##É2G¼ì}…\ÂÉ1†ƒÊ<©#m‚ª”v“º€ð=;I=’|–*¢¬)P¢ õI>1Äb;ÇëH‡<­-X±­Dk&É‹&ž‘Þ<$;4O¹!‡|Ñ;F&(‘.E@*Ъ° ( D¢ ¢B­—šHþ6";§|KÞùÄND‰9!Éxpä¼Îsrn~/`’JRšB2L3’R”³!’a™!ìªñ ùLJÁÐOú!OæÑîwö–üÃ& Þ(žQôZ?Y3$¶[cØE >®zÁs  Ø76… ÐX醧†Áòþ퓼DQÈ› &¼w²©hUK†Uµ~3EÝË–äpš¢‚Èl2ä`T`XÌZ¿"‡2HÍÇÑ„þØv$Q=”êc(Œ"ÊfzV®o¹ )–KR` qÁð¸Š<”`=Bh ñèIDRM´œs_˜Ï°D±íy Bd OF)nݸvÍföÖo{fõ½¸8TVÜ4Æ: ²E (Pà*ÛÎf×|;sg.8áŒ^—š«Ï9$…ƒ¤I$å$“ºFƒI"ÈF‚…YOQÂñb)±Õˆàº)­­»h¢P§ÓYÃ5RÝÕ»\¼tÎ:g=:èç‹u¹$’8†Ãi#ŠH[žrÐ|„z…By›¡×9R•"VÙKI0‘DDADÄxªèdÙ<Ó§Nè::TGAèi"M%H¡C|bI& ’\ÐfjI™‘s1W2°W3½QC¯ àw³Ç†ž^¨ü4ý¾}þù™Œc 0ì Z,¬ÌÊÃ0Ì3;¡ÝÍUWcZªJPã]ªûz«ïm^á%(!j (Z¶Ú«jÒ4Hè,xˆŽc@2¨^ÕÊ=P”ªªª¡¸ßîüÉeÞ7™…–`Æa†…†YI$–³/1^cmŒI¶ØÄ›m´¬dɘ@ fB˜Ý·/vYŒY™ƒÇÞ%mºíG#¼DQ¤ìI ‡¥vËXáV•EšÔ¶Ü$h?hiäÀn‹DÒDÑ>¡… í߉â¶Øww@[e–K%¶Ûm¶Ûnf[™™™žc‚L$4Ò'ˆJ‘ãMB*2¤i!YV†k$I„ŠÕZ¸Á Õ[mÀøÀì‰Ð{PT¶…–~~¤s5@£SêåWÛÖ²µÒ )@#T5@­ms‚@ $¥)Ie$)‡¥ª¼ë_¢Zñ[^uR¶¿cÍ<û&@I)JR@†RH˜JP€vÚkZ®%4!!6¥ ^{S„e}]ç9‘ûÓâŽ#Q¸üãhßܹÌf2c Œ:·mGc5»~aõHŽä9‰%&ƒçÒ Dh:è¯ef¡§tI%·i¡%i:N’ÙT¾Ç€ü¿F¢&ä‘Ö™ Cû_½0 !=› †}ñÁM±/ÜJ¼ôÄÜèphV%\âC‚iT}l þ%Â6m0Œ}Ôy©'ã÷³’pMÇ(ØŠ¡•_ŸÐúö6Ùýäÿ/ñ‹™ ¸ÍÕ˜½½òõX’J¸oœëêO»Fˆûo»–ª%È·Þ7{oI»zÌÖù’MÞµ­ßu;$ïyĹ٭¹„ɉG)&5 y¹XªÒZÓ6L¹¾÷S{o³“»ßs†pëêï5¾ó½íó‚ÙعœÎR8ïœÍu÷»™Íï½Ö»ÝîMó½Í­ïquQƒe¬DE j«cbÛ8ƒZêš©ivæ%9ª×­ßy ´Ý G ©iñn:Nwonh±r÷ÛÍêõ­læ_uö½ó5¤<1#‚ZTÆ1¨Š|w’î#k«]×p€¿ß*ÊЃg•™N¶Ê±ÐY)YF³¨K)wRˆVéØh°·94!ÎÎã)Zm$3ñî )B€œÛJ$<_Ÿ|nð#E Ÿ´^45L@ÄS[øÈúßÇŸÕ—ë¿—óüu~—¾¯WP” ¸ÞÙÅž•\ëvq¸à)Ïð9 9GæP Ñò«øôƒ© Ùy÷à`¢DÇš$òšC€l>H¯ŠFü ùÑô«E‘(ªYnçÊ’SK!$$¦–BHz^ÿyËœRŒÉ tòŠI äC P¥Åžðι|‹—Ë3*‘u‘f=ÓÍjzëHwö×½ìÜ6/<ë?~9n¤¯6‰5º-毘¢Þ‹{­ '²¸7ú©m&ØgÃ{åÂyŽi¶”ãF¨ËMÏ@ÝYÂè4­bF¹Õ´¶Ì—y=U¯Š`Õ³ü: 8µ[2.õ“ÈÖøæ)âìœ;)x®oÍéw«#öh8eè绳fyè2ÝùD>=˜ø‚9še–Ý·ßAˆ£ï‡«Ñ™qq«@#Ëd¥H”ö»±/°Šçbݯ ÓHÂc 0*6Œ6&¨‚QQ—nyçTç· Ÿ„òHWí4¬>MB#ÙÜ(`ÀÄEI© ƒ´$è6Ÿ!%’¸{½å«*_@’R”¯wJPéí×8~ ¬Êªá@̪ª¯ÊÁªžz„õ?BÈ*…X)OšC[n¤B}Â’G 6)#È0wÉrÚªS â‘Â#ÀbD­üPY¬E°‹s8ÄСXzI"#Â>Ü6èï/‹l”®W8ÒC•rg”0̱VÕU·Û†^‘<™Z\Þµ­kM4ÓF5&$v„p @2€Uª.òèšM¦›‰É$’I$RFä…UT’vªÕ €ƒ”Ž+Éf8»ÉÉš|ý=5ã¶þ½ß\s7Èlç»ô󑨼^;ÌjT_aG/½×¬GOSÒæI|ÜÙÍzÄ­ú¥àêó& ^;£²«‡‘ÁÁ_ƒ³‡JWJù'M÷Ig¸ X·rFà§,ÑÁ–|êþ½®<Éêå4w%í'xAfbX35a˜˜®äÒ²{Jû%¥ÆÒ‡,.úagÜ{ÌÃÜ‚>à˜ÐjlEá†4f&Aìw'M’»JþÉ,m.6”9awÚm,K{ÕÞ¾åf%¾î¸=ùñCn†2¹ðCèÑÀƒ—±ò˜)EÇÁ$„ôŽãyUJ¬ªóÁ%5ðHeYD‡j³UÝ 5Wv«ê½ Fõ¤ƒâø)}ß_Íö ÷õ_ e¸SÙ8='¯.fùíž[­9AÓv‰P¯²Kœó­žXãV€ÖxF3¸­]Òœi,¬,(ï×øs¿–7Û]»FÛörÜ8cYa„†ýý¯µ6Õ©œ z>³|qâ°»¸Š8¦-Ì‹E¶¢c•ù¨‚QQnÞ]µIR¸pË#-¹m.AË,¦‘„ö3cË!ƒ@"O§\¥Hšâ¼_ Æç뇫ÆyŠdÏU#YèF¸ÌQíŽ4WÆ2m+Êós¥wߪx@îΗà¹n£¼/k­. Tå%q!8úyÎ8¾ä$¦–BH0IM,„`’šY !ÚåÏ4ç”® çâ.[„¹Umñ!ÊYDƒêú»ëwíìñãÇ*õÁ%4ЂJi $#”Ó@HF )¦€šÔ’NƒRáÔ“ôp¤sïm¶Úª¥QU5H5J  Àµ5MRÖ¼ZÛeWÚ½ IJ <êÞ—²”Ò+ÖÖåW)m+Ç””¡Jñ¶ß ®Ý%(R€$;­«rä )B”6ÛÅâ«–·&¶µâñJP¥H}{oKi÷!{H{KW[‘à¤×´¶ÁäB"wCêIïd2ÖÒ‰Ëm¬¢B$2¶Ô¢B$0Hej”H6­²‰$¦´Ñ‘‚JkMmµWÑ8ONïVcà 0`¬Å±"ÇXTB$'¿ñí²Ë%émµQnp¨wˆÛë›G´×—«»VÜ|ŸŽ§\’W!Qã}—‚g° UÌäÌÌ®ù˜ˆS»®½zd”©£, ÚCU§=ÌÄk„czEpÓM(’ÆŠÙ\F¸JòSA•b6 H=)(ÏV’£e”úÞrîà²3m—eÔã'–ÆvÓJí–Ê/g,hö{9HU ›å¶R¤@ÒL"]“ÛZÔ +Ât“5¡°6/~V³ÓÄl~ñX¦mKg,§£8Ž¨‡â0ÃIe†uÇA­û·á»®²Ã ¾c~þé^KLßh׺9Qi”âŒ%ÈIdyRùø¼ž,Hs‚JWs!Ç9iÉÊÜ沪۹Ô4À<‘ ïè"õm"1Pö‚0™¦¨0FÊ¢ÅS່¦€š¿ÙÇ°°è|;ßMÈTA(¸½økÙT•+¿YäÄg»2/³Ã<óšFV¨}–‹h”ÕáÂÎo1®K°eºóÙ‚çLçÂ'Âùöõm’Î;v#%Ä\Fº¾úëE|¤Â†Yo£@"ï=e)RR8Ë,°¯*WmsÉu¦í9áÆšM™Ö›‚ËA†[vòËdñŽX2^\'qá*. lºÊL*©Z.&TËk똠çº#ªR´g¿1-pÛ]›+vðß–ÓYa†B7ïí¼+m€GNËeºsCÏIé.xª=Ù2 òªóž5ã„O¸ dŠ¬!"“(T¡2)Q¨Y÷I2„“Ø}‹GÖAOÏLc(¶æZÌfU[e”TIP‘UYa™™–g_¾6Úîì²Ë,°°°°°J]Úrä’îîîK–îå—wm˾•Uü€¯¡T"¨+ãá¶ÜDH‘"¥@jÝîI"I*¯…WŠß„$¦Š‚žÐÁ% ùz±”ffYimBVh„ï€I˜!$9ëm°Þý¸ ,Þå9²—ì~þí¼@Ê•ËITv²`!B’S™VN°qÜxl‰mPZX_»„)ç³kòå¬kFfhÛ¶™®alVWÛÁÀÙs| ÄNé"H!M4@$`’šh€ª¿°ìHà1ć¬B6ˆ>áÙOˆ²– SH‰&’> îÛãé$„!I$’I$‰H”ï{Þ÷½ï¾íUñ¼àIJ  mW®×·i´¬$R€JX÷^ IM¯zC¶”BV­®6%TE DiD)FŠZEz ¸¤lÇMUa™ç™™˜Æ0à ë ô‰;¤i´Ša"¹çj¶Û™ŸŒÍffƒà²$ÚGSŽt¸¹$ffãº%‰#Ôßg/ŸÏÓÇÁ‚¨b(¢„oÜ°i;%ž —at˜áÇxU²¯ðˆ‚UI&7UÜ•'•kÁsÏIwK*ìŸ AB—è/‘ÃÌ ÅÓSRä–âòÜÏ™ŽÁ1 Í-òp÷ëß٠쪪ªJ‘jò¢ËAŜªnàÛ0H €!¬¦caf€ n Âæ)%€É×»!ÂR '·HP´^SJ µñ‘×—_tçš©4UZ3d«»vçrI$•â4ž{œD 5g^[ß¼ögÆùª¾z¯N¢ Å IY¢Q{€<Ì !V$šT EBa IPÁï»JP¥H$ )B”!ôë— IJ¨ ªª"¬DÝC°Ã>^¿qzÿ&’ûû«Ðµ¦’Öµz´ÒZÖ¯BÖšKZÑg%r努åË“g"œœ˜R”ääòsá$|ƒÈ6©mª¢¼Ug4„ñYUåU½Õ,¤U2—¿:$¥rœ²VÜ ƒiABÄ€|dœR"BŸ‘#è÷øyt´§Ð 8\ZÜH‘7¾öd X¦›Þ{«™˜—f{cˆÎ5#]n  ™*©R;UA8rºêõh8í¤ 2a˜8PPVÚ¾S¸­T,äæ{pÙYg¤©,²ê ´ºnrÙsQVÓLIÖ­ =6UÆ{o×xy3à»Xíª‹ˆŒù3JÑ£(ÓuÚu6¿ ÂcXœ¬g’Š¿àÖߟœ›1Pb¡³ž1ÀçÔõ a6Ù YcŒtwS-Ý{†åÃMpßløØÚô¼e ÆÃÊrá5l\ˆ•%…¸ßt< jˆˆ '‹Øoá~ÛË]0}›©±é=ºœ§¶yn´åMÚ%B¾É.sζycX>YáÎâµwJp¤²°°£¿TCáÎüXßmvíoÕËpáe†÷õ>ÔÛV¦p5ê}føãÅ` tâ(☷2-Ø ‰ŽTKæB¢ EF=›ytªJ•Ã†X±mÈ‹ir¾Ye4Œ'±›Y }:å*D×âø`&7?\=^3ÌS Fz©ÏB5Æblq¢¾4i“i^Wœë+¾ýSÂLé~ –î]ãûמŸ= ­|iÙ M}[i¡E€}ÕU 2¼(ˆ#H¤|ÊÇ"Ji`0IM,† )¥€Á%4°=·*iI•E}[¢Ji¢#”ÒÀ¶Ûmú¢;øŒDù$n$$Þ–”¢‰>ýWÛ¶bÚI! •\¶Òm¶ØvÀ1•ffl4 Ö3pÔ µÀÖðIÁ½ï{¹†e¹çĆU”Bs*שTªU¾|R´4„öü¾äõøð}w«Ö4´µ¬Í6k2ïA© kWzÞ,ÍMi¨àµm%­jô-i¤µ­^…­4–µ«Ðµ¦’Öµz4ô’ZÖ¯BÖšKZÕèZÓIkTÀñ=Ã@æ$òHÀ©tØQCaB†A Pù‡²ô©¥&Uöï$¥ P‡Ó®\%(R€¢*ÄM•@.Š½D@ÒÈI )¥’Ûè½—`IJ  û-gÁëb,’Ú[‘lée“ªËl¢–’¢H´¶"ÙÒË'U–ÙD,ù¿b D‰:SY—WÌÆf3¼“º§»è $m…<$7ó¦ŠB‘U"z,ãT¢“€ ª@ß®aVj»¶íˆ‚UI&7ÕÜ•1­5^ûâûsŸgÂéÍFš[’.[‚ZãS1Ø–cQy¿†Ñ¹ùÍ™•UUIR'‡+¬´g0ªšë¹ö»¾î®:N|•I¢ªÑšê¼ùâîI$“¼uAFÑ¡¯Î7øoóßá†Íû{Ã_ŒT<½'…°]m¦ÍΙùø¢½‡±ôcÕDZ‘íú~¹\4¦@méÔ'+a4ÅZ×Q¨@„aJd‚H$•R›C¸WÆ*Á+{U¶ÛZFe¼‡ÞDšÒ®$3<‘òB*~@OüWîãþÝQÿ¯á¿IúOȆ‚P:‡Gú¿R«±ÝåÖÿ×ýÆöÖ þw¤˜çýý„q:wmé=§wo˦8žÞí»£Õ¶Îx_ú]µ'ýb}G‹û Ãû„ûÍ97 É™™™‹o­î³Ãÿt­´Üƒ‡Áߺ<5ºv@Ðnà€" ¹!Q'}Ÿ]ÞöÉJ‘в½N£pÑÐä8?ëøLÿŠÿ0Ã3$Ÿä¿Æ0ÿ§ý»ÿ¢³m²ª¶ÛZª®7ÕÓœ\ÞÿÓ™™Š®º´·Ás›æ÷&d’fffk[ï½Ç;k†fg­ÅtÖ½ ðýG ×’0$ !1 ©ª|G¬ûëËÕó³GáòGâ—ã,boô~züp¤*¥/v­Õ⮤^RGf®Rò–8ÒÖ[Y†4ÃAŽÑb!¦C6#q•efœS$&« 1l1Xœ¯/HÞ<“È{G€ ®^IÈ:ræ>gù%ò& b*úuí?Ocþ'úûº†c—ÔTÒ¿o‹4!ÒŸ\~2ýÄÓÎõø¡öeÆ1Iÿ>)oµÕüþqUB’wçƒú…Doâà ²ò*}‘–Wof“´¥^w–´€²ì‰5@äýy­ôã·pßi[fSÞÌÍÂR$í;NÂæ‡icFæ $ÜÏ 1¥ZTWŠº’k*L“Ëã¼Ôêfg6ÓŸ óÅ:´%åÊ*¥•NP¤aÔ¹B yYºè§§=œâU^ÁÞ}cÚdÒÄ! „T¡$öÕì£  Nš®¼yòð<#à{R©&$…N©öÖ¡€‚t—XòÏÌ·eNÕU~Ï9Þ`ÿ˜çUƒGÙ·A¤$ÏjßHr&•&GyÀ°Ýi¬¥qIãù¨ös‘$‰¦9líÛçŽd{ùÿó+œgØ>šÈøå¹ÝvŒÉׇl.šô^‹…>Û‹,Žû‚jI3 3 òHè…^:mh;BµÚí>øúäá‘^½33››ßn*´0…0²ß´ v®¸ì‡Æ²¾¸ç‹ìffÙxèÔ<_ 1$ÞTÝÃm8í xâLŸ|!"ŠÏ|)K² ¡ô@“Kû÷Ī¼cÝ¿ƒ\ð}’bG I›?Nþ8û¹úí~„>øN‚5‡Ú!Øþ8ä€Ü£®Œì¨Cø¡Ë»²ÿr5ýý|3Z6¨×ñ¡¥Š{îb5[2íFU@`2é0q …‚ˆ`fäcü˜† ÀTR&fJÅÄDFb‰4¸cDHÁH:ÃÇgù±ÌWgbÇõÅý±¶ÕUJŸÀ10`ÃÐþcójÂQbR!™‰F‚«{Jª“N‰O »ëçI&J™Šd¤HQW™~ÁþIˆ)]Éû£S¿‹/)?°dK"Ù4¤R¾sú©þOËhJyá4:%¿àê]T£Ç¥ !4¤!4 ö–òâz„ðUTÃ×È"à u"—úëÐæÅUAOupª©‡ewþb@©õ$¡ðRq7$ãyø¾Œ4º©úÌlÛÃàs#õQ$æk x {F¤Ÿhíü¥ñ/9ì„=7¯_„Dž°;¿Ä΋`:€|¯ïú§ˆ›ü…¤–RðýÀ{@Mˆ¡ÇV6ðáס5ÚÞÊßINuo(±2;~ík ͵¨Ô~}¸Ž{qªœ¤©fŽÞþt½¢r÷Bì·6x²ï0âŒáNS.N²G…{Þ²§›}«Ívž_~ѹçbȾq™,’Zì“óÿþØA ¿á‚ˆ}#²XRPÈ€¥( 2(ˆH1Äý¿¡çd’| ¢pøÇÖ†£¾=¬.+@ ‘0Ò(ÑnL˜5?ú ª¢nzáÀ|€ÇÍÓ¹šsZu##4Öe-“I•­Fµ2¦P¢,’ 4“³Òþ4ÑÊ¢J’iê~•R‡ãógŠÉ‚v=?Áát&à¿êê(·„Ubú|fІù$é﬌¨ôºiŒ–mË$xøÃ$íxIt+¤xíÚ={‰Iì4:ðO¬% /œAñUðOaÞ ‡Ó‰îîTCÙnœÅ/Q‡X#÷Y)!Ih±fI"e&!i!42r<×^³½ì‹ÕNåVa~)‚úC‘ì‚‚ªOqQ–X÷ˆÑ–&GÞ'Ëëñ÷UòÉuƒåѵÆRe”Ì´²±ûòjµP†\zXôûÓÙ5:z ¶½*‹õæÉïb…¤)‰€} îÝ»!öÊÔBÉ™“FfI ƒ¬5µ÷‚UTýîƒ — @,C E+(£B£§Ôž9t%5«C¤CL†XÑÁd± =ê~¹ ‘™Q‘¡&`Dà÷¡é”¤hÄûGÓËñJ§ÞíŠlï„ÛflžÜÖîĬh–lÖbï $HbIT{ÃG‘äõ˜é¥p:lBö;<¢ =ÇÍ)ß ²aËI’ŒR!âÉù©$‘» ÒÅœ,eaRe¶·m! ø¡•.‰ˆxA~•Þõçaê !&l HHÕ Ì´¨)(¾©tñ$Dø;žsàw{!ŠMÔÁ—I¡Qà >¾×ö~L3ç÷ èéwU·'ùãI§aø|_ࡹ?kèþ—öÜ¿×aìƒüÞiÙ>¿-ÅÌÅy…AÖ·ùØm«¿@ßË‚(mµn‚<<…¸'ýÀÿ™é“ÉáÔÿõÑ<±ü´\Á¹Q@R)ÿ9±æ…ž_?Ï›k\CŒUAê§sA0¬¥LÁ{Ñ‘B U‘ç Š[nG“ú¤1MÉ"¡ºóN€¥‘ûé# ä®Èv<ƒ€PTRz$‚?!ÐðBZ6MmõViŒrÛøÖTóY^«4ñbúyí^Îi¢H‚E‘Ԧ㨛ªl¦ä *ž#,DQ¢RÚEèß °[ÜH- DEc¡ Õq5¼æà Í‘§¤Îm\ÃC©BÒ3&)°¨®Û9€3&"Ì,Œ‹„ƒL†æÓ#!0Mkp™'¤l°§Ç A ’Ó%Ž© `mߘ»¸*2AEäìëDÓkK†£qÖ¤6bÔÉ™‘J¨iwaš]ê­B.ÙŠ– Ò¦™Š!ª— Y2i.ôÞøÐ1jÕ·ˆÚ4–ZÔ—]! –;! :µ(!¹o:”ŒÄÊpŒ‰ªBr4ØšÔºKI ¦R-J'6LÚ`”fÍ,.µ„%UNpÁU@Û&‰J5œ)º‘ TܹdÆK‰Ñ`Á MŒM¸Å í­ª7TM0HŠ)&­Y¬2M@X“ð÷€sâ+Ê6þôn??g“ÃŽâ= wSÍE’6HîàôVœ;d‘·­xVæЇÎEòŽŽ“îá’!¿/<ËÈÌÀv²HéxÙÃXØø«6¶[*Ú®•:^=ÝÜÎUø¿þxþ˜åÏ*YÑ4pÞƒs $‘$(ÔJ5Y4Ê­|¯¢±´Vƒ@–†,*ܲÔô…#$ÝE4²QûkçŽáñ‰ž}†7 ClÄѸéQ`ž¢š_ýÑQ‡b ÂGür'ä‘ £ÖÂó-ªÉ.ÿdzºBÛ¹ù?¬®æ¤I”Uíðœ°ú…ò>Ñ<òšæñ_@ÐEDD!1,³èî—ÍŸ?ÏL³vép‘î’Âdú2Ct’tƒþ¤ö—yýÀ— DoÓ‹2¦÷nà¿òÙ?Zz±'ìHSõ»ùÜf´xûÛçe+÷Vßbº“Ê‹RÔšE1̲ΒÁÁ²Bq [hƒ Äõ=é0‘ ><–‘6µócêÃYRm¬€ït’Dñ„‚Ydƒš`ö$wQ…ÐÀòLüŽ3é={È(ã4Z;g+=,&"Iãdû# èÞ‰»lªkb£KH"øC5ðDºŽ&9"Ò¿œ°Ä¨Æƒt*º£cÜ7±â4Χdµ¤?/ÕüIÝøßV™Úx ˜g§Ãnº`ÓÀ.UYÃ3I†½5iƒ¥5êUÕ€8U¶ZÓ\si :Ý2 ‘Û›aH"ÆVUEÑ€a¤Ð¿× ½­2{Ê&Æp›R’®2gQt‹vš~kÀ5¥ò]S¯˜/hƒuëãÓÖ[S·^ùèt ÖòÃ%–BY d%–Y d3 –C0Éa1à a%„Ì2Y Ã%Ì2Y `%€Àà `00ÂX pÉd3 %€Ì2YLpɆXL0ÂX Ä0 `%€–X `%€–X `%€–X `%–C 2XIe1ÀÉe2Â%„– %„–,XIa0S2Z3C3,”fe’ŒÌ²Q˜2™d£0d,”fe’Œˆc0¦‚K ,$²˜æK ™’Âfd°™€`’ÊK ,&`$°’ÂK ,$°’ÂK),$°™€`’ÂK),$°’ÂK ˜d°’ÂK ˜¸$°’ÂK ,$²’ÂK ,$°’Âfd°™†K –,&fK ™’Âfd°™™,&fK ™’Âfd°˜ƒ†Àb˜d²ÂÂK ,$°’ÂKK),°’ÂK ,&`°ÀK!˜),¤°ÂK,&`°ÈfŠK),„°€`Èf#!˜2ƒ!˜2ƒ!™&"¬°’ÂK ,$°’ÀÌ¢ÉBÉ`Ì ÆY(Ì À1 ÅÁ%„–BXIa%„–0É`3Ä3Ä3–YIa%„–XLÀ0Ia%„–YIa%„–XIa%„–0 XIa%„–RXIa%„–XIdY*32ÉF`Èfe’ŒÁˆ²Xfe’ŒÁÌ,–ƒ!˜2™d£0b,–F`Ád¢Y À1 `3À%€–X `%€–X `%–)²¦Ê›*l©²¦Ê›(Ì–X `%€–Y¦Ê–ʦʛ*l©lªfX À0 `%–X À0 `%€–X `%€–C0 X `%€–X&Ê›*l©²¦Ê›*l©²¦ÍM•6TÙSeM•X `%€–X `&Qd¢ÉF`Ád¢ÉE’Š°ÀK,°ÀK,°ÈK,°ÀKF`Ád¢ÉE’‹%J,`%€–X `%–UJš•*l©³SeJš‚Š,”Y(²XY(¢“f¥J›*l©³SeCeM•6TÙSeM• •6TÙSeM• •6TÙSeM•*jl©²¡SR¦(¢ÉaE…Mßáð…F¼¼NÐ !4¸0"‡¸Æèb^i«N/G€ÉŒ 2#C š<Çg[ø3¦ èrð(l†Ò&wÓXf:t[£"J,’bÇzä¼ÍÌîÍ„Ô‘3Š,A¸Ø#¬ª©­ƒŸ¯ WeW %©TŠ=Äêê½¹}Õèò‘ç¨ê&l‰ð Ù<§ëŠ$0äèÑÆûqUeµ\CGÒ^¡u9äßœnb»z|7iÚ&q@iÐ 6„yçN…åŽ0Ö\=ü÷¦•(;x©ç†v¨ó•á”RÐùA×@UCØÊÌÊBŒa¾{g~GepTWN½v>›×·¸öVÎÌ lˆ(ó³VÕ–ÉT,ðŒZw\¼ÉuŽ7ËC݃ó*—%TFzì®iÕí«ª=aAA©-èM¡‚Ä„ê,,U<½<1ËÏ;‘!ÁS$!çÇ[’I(tenè÷^z`hÓ5³·¥Ý˜ûÊ è½QÝ;%µ…* pe7 iËÌI,- }_~؃aàR0§ë^úCq—îÕ«ŸqSÉRI$qb×!;´À› ›A$1!âTįº¦Ë´›ÍyújDÛÏ}¼»â7[|çpŽ\îI$£jŸ.è½ôó¥UïA‘‰Ü¯}Z±ÍÕžœ„ß â9u<ï®·a»#¦º8ç¤Ö{YkWÄ^╤!ÂÔˆj,m™-’æ! ±ÚÇ–dw\ËÓ|¯#Xp8pWYR€v“&þƒ—k9ÜœðÛ®Âì%ÆŒCôN×Ïza¤=N1ÅáVE’"› )¥UN‡M<Emb= æíž½Š £âöY£#¸„Ú¯{ˆÄ‡q»&#Ý$jõGº.´Qƒ ðØÌš•à*71,E®e*½©€ëÞ£ª…ÍUNu‰0$Šž"C#ŒdMõ[Ž¶r¹èh<5‚ª›Çjã¬i4›ŠuîE§wzì;ðŠ¨j1URåoA +c(ôsžù34ÇG±gƇžJ¤G…'_â“[ö[uâvÍÓ¿ ¶¸å & (ëÚËGTØÛ6éÚÿëÔðH½ª©Üµ¹ªàêb¬ðp!8pÑ[?° ÝôyÊ|I7ßöE@oÚgÄçß?B^~«Í#ä=fÆÄѱâhH•=|oF„ùùÂ÷ÌÿȘb)bGå„Á(œ„ÆB`}ܪˆî÷mhþ5UHÜéó!Âlœ/ ÊyI¹÷g@õ@ïRšV™$[,–=¿6‰ò$ßÁb@y7 C|9u±ÐôÀÛÌÓ§"t)0é:‰#UŒ†EöcMi’2Ç[yµ¡`w¬x8D×âkVFÑnŽ3!m‹‡‡Oë·NcaGj¨DD¡7q$ ¦ƒw€‚^Xqqt G§›ð˜Qa¿aTÉv¯Ô÷°ð=OkÃn¤–ÍÛ)µÎ&áÀø1<”mC]²'‰ç¢váÙfS÷Ù¾®{«Öü?võà ¨—— ’é&%ñŒÌ:÷îz><»_‹>6>ÞÌð„<óm<º ãoÌ^—Ǿì0øÕuhjŽý—Y½^Ýcö³UÌ}O"ÙU]ÊuÐíPPJ1q>7áÊyq¾zøýõè°é/<²fô ˜o$Þ9Ffºñ=º ç‘Ø{>ÓÙ†<ÆCDY*_¢Ÿ!ð?D;D€Ë%OÖˆý}'Ê'¸àåEœ©ÎÀ”Ä>Ä&Bä>„©‡=X›ŠŽ· ˆ•Q‘P”¥DfÕZȵSIM2…÷jÍV”Ùôâz#ä<ý¨‰ÉÖ$ƒ«¨¦!{‚Á„ó4Ñ¥‰äÒaÄáéQi20TÏ°>PQ@<$1$MÁÁùšbY,Àbd ÎOsåžÎòe¿#ð³à~µ+Ì÷Š<‘ÜüžŸÜ~Xõ”¸(ÂP4´b÷€&P0lÏn£9¼™k¤”Kˆ%"“}j‘nÛvêuØÒEA6wštLG8XIê“W«7Ñ&²T… @š4µI™Ç'˜u Ë ø{ú|Bò/\G<ÿ vy#‹>3ûÞm‰{êÇ^Õé Mmÿ(FVFPïéO“ ‚9o½¶\a=þ+å?T}¨öJN&•­»šãmœqÌmkQ·1©y‚Mñ#¤ïoçspqœD‡X­K¾¿)ÚwæÙü7‡-<Ñ“²Ã„Ñú@ò:’3˜$+ŒIåãx†1/Ízýè›ë`»MSV)£_©áûŸÝüžJÉ¿::bÍ 4óqãw¥¥•t¥àbªÅF*)"£qU3¼¸úu£DPP½}9¶ÖÚW‡AÙÛ“®îQE»ÃÀõp'$T‘7,îuµnufôÉ“i˜i6é&ªÌ¬¢••§’Šà BGØ;jB,e>o)3\09îá3-UÞª$xtÍðéÆÑ$sÞâ›%Þ˜ç¤è6»$›šÇËFs+©WÂíê@{TISßPàÊ™æ$z[U\özôïmˆ¼±€R¬Ðô«Š† £.h­¦o˜vÙ‚ˆÊ¾Ùže*|¬ÝD²€ÖŒ\((=—Vë•ÊªK×®8WQâ*›Æv³{ˆž"È„NÑÙ‚Ù,‡.©ÙÒœWEC§¥°©ÉBÉ<8ñÈ´LId…QÂÉ'†aÊ<—[’Ypðî™caJ-ÆÈ}†{Ÿ¢¦î;BPÐç9L\ʨ8 ìõ§˜ƒó“é@’V«Ë¼wJ«‘>†`D#oB’¢JOXǧÖtSïEž ãŒ,Å%0?žÑ²‚({•~ïåùSöOè6ÿEKú©Š«&chITü¼ùÚŽI TvZÌÁÝÁG,`b¦¯šM©¨ñU«·h¡Ý¨DKa »³3znŒ¨í[¢×\ôó}`GjN ]ø–HÄ ÕLÖŒl̔ʴH‘P†–,¯ÆÁÞfp³w2ÆF®k5a èbMÜRL¡R´ª´˜e˜L…2Žã­®ó¾——ÀUòÇ0_"xžÑ*BI&™m¡%]—=©‰p–›LoëRÖwôÖ³5ZÍok*Ê£¦+í+clÉqp®GAÇóá¡ûä'pþ¬þLÌú6ÿ‘>Gí ñ~&äýòGa‹z·'±ÔÇX˜bO?¿ 0JÎSí €•H À—ب£í@½vù¹øzv¥rnæ—Üš­ï7wwš9•1–‚;µpæÐÊ”°™d54L”¤ˆAˆMwŽÀÀ2zB&äFD@ˆ 3ΪºäáÌ*«ª³ÑG5òMìWƒ¦yÃñ6tðÑÈÙ 8æ8¸¨ë@ƒÅñË'̘u’ÊEaYZWòæÊíPXªª¹ž¹;d‘Íp7TPØkZÑ™£6Ýá8ß{HŠÌûD½RªïFx>É°Dn ŒÄ"Ý„Ž¾""kó‘óHÿ8óöN”Ó*êˆtú°4*Ê&Ø—/Ì~sðÔš$ʃCxy#1W Ô„dý±v~ãü±aÙõ?„íõðµ|jhÍM#r‘aí矩š$‘‹üe¾…IQ11”XI‹² ¤v0qF‘;ä`ƒø@òn<ÏêñV7€Á †ŽïóùžÅ3)ªÌÁ˜a22i‰:«6¦Mˆ!£+"$¯Óµœ$À›»B@1¬’„K&ø˜AHÓ+8Ñ¿W™$õ²Ë`má$M,@MÃH$ùÔ]>jò !“Ù©4“RrìýO&š% TUUUpé¤í{[0ËE’HvBÅ= òþ6+ „’äàI$@D PÌø1$âM§jfk 0iPÄœ0US#' \ÌR…s0 b«Y£XhÏçlû>Pc;ÆH’¹N™$•'ýUeA dƒ÷³º©ú`¡PØzÈú!ŽèŸSŽé ‰þ½´*RP„ˆ¦ŠŠÉb•(ՔͶÛBØÒª¤ ‰H¥ È2 ”ª±,*04Ja‘”ƒJD¢P²*©„­š•Iˆ´h-‘j)«-( VØT™–š ûy‚5 ) @*@ÒP”ªíé¸Íw5Åè:Ùg"Õ’¬…ê[Ée‘ÀÈà !œ=‹Þ‚Ç¡VO•ê5†äIçæÖІÈㇼÿ&'”á:x+¤ž†T•×RH©ˆ%¢FšS4TÙ“IVEi´­4ÕM‘Vh¢ò7:“TD¤® !é.ÖÕ8fOß›p“¤•ÚrÕª¥_l¹î‘þXøé;ŒíòoÒBPþóèæ’Å‹…P~cöI7UòHÈatn%ì’÷~9úê?¦ö_z­¯¶ÈÕFAý0pü¯¦»Ë÷‹ˆ«ú‹ûQ{N/kÙþ^Gµ^sÄÕþ{®b½¿Hª©ì”öl}ˆ¨B ŠŠˆˆGòBÞü¿òˆWŒ4ý±' ú‘èýþdôýÔ~ÏvÊr â‘>ѨHX’Tˆ*Ü{ý(‡/ö*ª@Š(*I J¤ýèCdË á/Œ>zøÀHÀ?ÌIð$’I HÔ‘'›ëÙèôí|¤èXôJŒµGùcý¿GÜÿ§(–‰æ¬I$‘ˆCÐýÜSÚ³Ê$¥E|R€ Èö‡ƒå%aI^!öï_o·â½H„€"#²d†0P$—¢‡:ò:§é¨ë¾è_ pa€?FؘI î2JP>JI‘HnÉ'7N Ê¥Ãåñ±ô~dÜ;¡úF"üwëƒ!d“ë}ùø#øQÕ=MÖéºÝå"Dü=é}×G#G½¶ÓFpz¶þ¤~Óâ ‡—׉ò}üèr 4 àYú µKõ™å",ÝE/æû2]{àˆ1ùðI  ÂVp‚—.8vPùÆSƒ%Bð"‡Êª04wÃw?×™ìƒ([aé1*(³ÓÇvÃc•% ¢çË]ÿ9ë[à¬ÐyüB‰Æ£ã’-?Í)û_Y·÷*cÙ$Lœï1Êl îaßëp–{TᆃÐó_šTÔ9 ¨L1¹6×)TZÖ¹-l„*)„P¹V D˜²FÅ“>2q }›´ ü‡Gaûç(Ǽ8Ø^qòsè1îST2¨€v$}žŸÏª4áßIQ6tÈÐH£•-¢Ì”mQJ¬ÅfÊ…†˜B¤ ˆB••JE‚E²$²†ÍÄ)mRHGß í~_w“ÿ ûDôÀûÔW½~q=ÿ @2>þ_GíwÛýÌkÂêœpq«£ ãcdUR!M[4S‘ 2RR%Y‚´1¥£†b6bº<±M Co‹‰-RC3rª©ãæx½Ð†H¤¤–DG…à’~_ "?#Õ~æ"ª˜”> Þ‡œ“âÀB $,‘aæ8º‹¢àª¤bà7˜=ÊÊÛHžD&J†JZIi-Dc dVÐ…Ä+Y+Ãè4ÝHöJ”E•Šõº†Ò±˜*ª©ñc1Òi®¦¸‰¿º~¿Kç—G¶“ÂOWÐÛƒÏGÉ4ûGÎèC¶’I$õŸ¾9‘d…GêƒtT³žÓä!iF™$²Ù,‚h‰·|>=6ö`ÁJ‘(„*£b&Y*ÌE‹!˜F „12H¥‹ igÈ_Èyü4šWhÂTôJn(¬&õTP„ænUâm)U¼«›r¾4¦c&ÖÛlß;Ùq,³s ë|ºJX©ŽDm"FHê¤àÕ¡$dÖàm§~xÑ2pÿ" õÉ;Ã8áNaªN¸g§¸°‰F—äê¾óepÒrèñì)ÜLA_qžrh”Žî:—xÂ>Œ¤„ìŸL4†ã#$†Íë#½:àž£ò©è€Mà¯jEºUÆI‹²­c ò¤«‰hÃ$bb@c„kXh`´a­&c¦(0‡µçGüŠl (®øa #Áê§a# ¡;øŸ¶}R§”B‹kl,Ä9dbyýø¶ÍO‡Ù…-ƒÝ˜•ËXhÄÄ°™½h¿Õ~¼K{« `ž#—£"äžm˜ÆäŠâ†Äè#Í=ªÈD8ŠmM7ÊÄáy‘ÄD©>d~SÄá¢:B±9¯Ä­;#Ô÷_…çñs>6˜Í,ÕêfLf0²3ñÄÅEÞn½üyñïûu¾³Änë„p̲äÓ&DÇ&à4ËcszÊÄÈÔŽ‰p!\Àͱ&dm£&Ó%N‘¶é¦1‘Ëë çêGwrz!N°àñCþ§>S ÀáÝ’;‰Óª¶Ú2XɃò’˜Ó‰ 1þŒ={á*ªž£cÂ? õYWùZc4pˆ TŸðDùB'¹ë>Bi5Q¥Oœ…‹»ŒÌÆX˺çQ¥í;ï²eÝj*diƒa# Ãì„9ŒRŽaÅ‘4€_aÂZH§GJ¢*Ûù»ù[wní©q+ªªª Ä»Ôé ïu  ­ ÔqgN#x¥$R˜–­Y ›r y+£ëgdD4¾©Ö–}Чyù3 ~÷×êéüþz0ØØØíÊ£í“ت©ëoÕàÊY†â*¾+tÒ"¬H9ÃìÉñx ~Î^¨ñ%‡Q§;0ðŠƒŽXþÏ>’¦ó%Ýe!Ò{w§VÄÆÚmm·i$åŒï7´[[\Tš“–÷/IÒ'§¯FåJ KÞ”m}Λ?fØчŠ`ˆº<éÞÓ±§1¶´ÅV%±,É%2ª,²ªH?Û™5MnäVôË°›YœãjÛ}Ìe­­êÆJD8’VãV1‰‰9˜aŒFslÔ6öl*)f&úbÀuM.“W«NË¿Ó¤4Æðˆ“aÀ3šu8i4bºh¨%E@p"ED[Rˆ+@ÈÅMŽ„ ˆ9)¤ˆRˆlb‰•SjhÌDj\¨v1Ö³­±0i" bK…§»^ñÜÀÜÈaÀáP~36žjqAàJD<ìœ,´“w,ÌÆÛ1í!Î=p‘Î#å»! JU†"Cˆ)3ÐÙî|ŽCsÑØ!’”:ƒz¯RŸ =ÙàŽäöítò“vÈT<Vâmë1ÄPм4­!A VÒnK$Czi¨¬Fý¤ˆpÐØÇú‘c£p#§P̈¦ö’3i#˜Ã^5KvSRÚð™Z]bóbŠ1$4[mCËì#O‚û¬1›6Dƒ¬v ÒMñKJú,“äñÀœ¡i¡Q(WŽˆj"4‚aé! ¬BI$jF»¤‰·›i*;¡à¨æŸ0$`‘)è ›FÍ"1’DòD‡ÅiÊcD°åd.ñ°„®c²˜—´QS5‹[PF¨Ëys|Ÿ©x൸‰Ëš’#ÓYÊÂ5¹•’L9—æ"!çA«YIC&‘UJ„1!,Á‰`…ÂH„ÈiTwwse6Su1=biã‘"¡p²Z‘™¨P N sHhw9]+»ph‰\wDW"¤h<7êŸd€ÚÌ›c‘:1’——S²'Æ]½§Ü{~`OšFÛ} méҟߘ©cðÛHÐÛþ–˜•RŠŠXè )üd;Ç2¦Äí¤!ÊÜ£5bZŒXábkF%g¶’Z”ÈX²D6Û'µÚÂx¾VË(ý˜zÒ„?âMóÝGxÉô&“D4 Ý!áÄûÜûí¸H)ú‰“âffFXLäa‘…•‚28‰CˆcC‚–JŒ.0©žŒ’n^Ç™ œ´–IH>ÉÞ~¢¡'¿±Y 6“F5¦–Z&¼ZžÈs ÃúÑ={¿›ˆ[#HQHÿ áÃöK ühýhš|0qSF a@Aü.€«Ôù…q?tðuÚY›’ zÚûÂϹ¦bÁÚ R¢HDá$dª–•!Eöª"xà Ál…¤H¥‘ùX‹" ab–”ŠCîü_L[*”!¢')N3à‹ƒN©2². "›=RH†Žç‡c4{ô‚耥a°î6;…U:Ž <ÁÖ*Š´L–M•"¥ekPÀPMYaXšÕ¯‡¯”áÛ¶v¬{OV[}M´u­¤’•ð ;'a9uê€(QAÚc‡½ÁŠ*pª•uŠ+VR t*H£0„™«%ò U¬ÈÜpà &>ÄØÉ@wpþ$´’ !Ç*ªtØÁ‰hF…Smƒ:l¹0‚§¹àyx]$å>•Aè}ðíë‡ „ó›ô½,ŒÇLXk{ú'¢<£‘¥'›”è!10‡z>)À;‡¦h Q@I+¦'o2$k¼)#û#ÙyAw$ö¿ÇS/ت©‡R÷‰Ã⟉’GuVßá,†kN‰„aó‘̤•-bö¤‚‡m¶€¡‚Iò%àæ{ƒäù¾˜áòÛŠŽ'Íwø`|ö$™-96ú\ÄÒnÖ£„!ƒ÷D⤰fÂRò%Qj‡G â3±Û}ÑÔc1)»ï~× ´Í ¬4çÚò „n#ñE¾Õï•?çÀü¿G³ãîôîo°YïûÿÓöó©ÊÖúñιΎ³¶ö„‹6¬b¦¤'D¥ÉhMb‚ñÅçõ˜:ç93Ò6m4rÛÑŒcÈmZŠî©7˜ $Ùø©±CÔs± Ó”ª›÷í®u¬M/´Jªìï6õĦ *zšØ¼ åS¸~r@ˆ=Âí+°(¦Ã³»·D;¬ëål½&AÖ3Êío 4i¶MF¤ZjïôwdHe˜ý‘ÄÐÜÈBíâyz@Üõœ êñCÓµzMÃòƒ=L[uF ;~ȳ‘èG»íèðîø1Ò¢AN~³É>'zíöX‹å 冸" 7*z$û6*ä?¥”¬‘Ÿ×˜ˆPÏyÍ)Ø.Ã)ÑI —I*d(d~Çdy\#£¹ð—¼±0Ec\å¹ j6㙼¸w•@`o±Ê4ª-œpi=KI…ö…z!§ ÈÍǯª½â¾/©‡&@z 1ý¸îüÇæJ‰±ÆÕ‚iSýÀA¢¿0;€D«g—$™*¨U(Ÿ»ÐŠç Q˜DB¢ˆ‡¬ºIf™ƒlÄ9*\• $Q%=w5Ç= pi1SÔ룡`-$¨S0‰@=XÁÓ)‚£L3D±+0„³©,²¬Í´¦¤’-m\årÒ•5bµ¢¤Ì¨ˆÒä”LMJu+Æžµ¢jRÈ%H-UBÉM,ˆoŽmŽƒ*ªLÌKP[ªªVbÌ©$Õ*%˜¹†bU1¾Ž%3¡%D€¦Hä­$ª‹9ÒÄA ðÛGƒ¹¥4Äòck9:twØ´Ù#t$×*÷v?R<“mÛÔ †•U;û{rr¤y½oæþ-&Ž'ÙîÄŒ†7 c¥ÄìõXE!YE¦„ (eªØAF³~õw'ðÌAõºy:4 Rdn ).B¦ñ†d>˜‘´!F!çaÒH8pü“#Ìééà“ÄW†–zóeî’|盟Çû9úy9s®}‡téÓÌUlòã͆0~öOÍá×î»O.ÿ¾Z²OƒRyÎO'LSÖK1ÀˆÉîí¡˜X%K™Ub•;jMiTÌZaï›ÔbY%Y*ÈBÐÅ•)ŒfÀd’BBACRR%!†&XÆkM£%IklÁ ‡#Ô1ú]ƒ´”#üÁü14 „Ÿ:KøÃè”ϬýM4‘ü,8†¦„H>1dJG¤gÂÒ{æªÖ—o~ÃŒI3ÔÒ[5¹µ¯è:þu?5àÓÌÔ©Œ$ϧ+kF†Ñ?KiþíüoºvS$íæó«”«iVj|Ÿ¯ç^½1ZÍ}[ؽ†¸E{®jõ˜ûú*÷ªÀ¸xÒ×Ô ÌBŠRð:IìѬAhî±ó…Yó™î“£d|gb4p<‘ø!3 ¤v±üÒÌ‘ J¼úçˆäô,ìhE;«ãó!ý­ 1$@³PŠ”…)DI© $"@èƒì%NdpÌ $L…‹§Aõ"CϘ9*Ôd7e>&i!´²¬JÜ…‹ªŠd}2;`ÆN‡ $x*ªbj d%Ò"¾ZU=güZÝ<oéOàža¹’rà‰yö-“Œq=¡øqXaAÑ LB»’®Ðš34c¦Q,ˆ•jº9D£€"«¿äŸÎ½?»þúWÀOZÞÞ÷&½wèL°ºEü£ÖwGwNŸ;;qoRUcËÖ@”òh  B“Š§Ð¨Ìugº­reBZÌYF÷¦«ãËÍf¨Ä•_îé'\žvù‹EºÓb`Ú-%_µyXöM|¼Ãt*9§B'GÔª*…D 2d»ž0„8ýüØUO5Û¢ÍMÎ]]Ý°ø[Wï*‚Ž"ýŠ¢¨¹Æ{ø÷…_ )/KµèMhDAw0S w”ei }t^ÛÔˆ†ª_U´igo¾Wˆà»4cB¨š¸:²*sß×ÙŠŽ ê;‘Ûݘ5$ôžNÒ^ÄÝ"¼®"ºÃ¨Ðž½“aÑ2ä>:N›¥UMAcÕ<\4û7Âé†U²¼P½]—g¢AY|t@›²cÌ0_nqvâf2‚=d³D×µ×­ˆ§Ô  uåÑG 6{‡µõ?–eÑr¤((GÛ!º¡ª¨åãõ]ºÒª ßÎóªdì2<¶Ó¼:(¶9Îau2Û{—^Õtð ñ¤™(ô¨úoÌé(h¤«ûgµ]‡½'Pgz«JȨ„¥VS OÓ”C!ïÌ·ºuZZض8-‚דkJpº;0A #ªc*Ã8ÑSM¡[º•£!–37æwCÔàwvMõ@UQUMT*‰¶5¬Ú««ž“‡rPÊÀæ…7U~Ûåõêr„T%Þ›X½ ±åÌx| r`jNÒ‡3®ûN‡°G7Âk{Ø!x°x›‰‘¾"ÎsKu|^;ì7[1ìÙ'*ç,e‹v{;! $˜Yª&2ªð®‰¼!>+Çü©§$¥X6i N%A]º0ÌnJ4ª¶y„0}Y|Á-ˆÞ“ê­*´((&XUYåÎEºÆAœdIæ˜ÄÛzwWWÍ"Z¯ »xi†Ëð¨\¼…Uùþ¯k¯ü:]ë8qUݸ æî*Eü0ˆ×¦gvþÊ-Qm%òLÏg¸û},–ÚJý—,  õDê”ê‚›¦MRA†“¸¡½êæ!çH‡‡Ý<ÇÔå $ƒç$’G!èéˆc…l‘[y¾¯‹“¦•¯»Vy¡OX‰èO»ŸƒÍGîret‡â®ï@7HéU]J§ËÜh4E?šj ûÿf$xÕ펇Ã2+„·4ȆKÍÀžvs´ýi­~ý„Íjh%Yk™>K"u¬ƒÊ¢Ü(†ç}w¦{!0ôŒž,40XNO[ŽÑ!è²8F›i|²J„*á+jA”-ˆ™+Œ§1aQ‘UT‚¥j¶ªÊZÚDÊE·ªäe•= ¥ÑQ8y¹Ñ<¤ `X'¹ƒ… !ÍVdî‘&ÐÐðÌê$Ž“¼T_ž½ù™óãZ;yNÜ=´âß‹eN jÍæF;>$’8æ}›Wtˆ‰¤„?aJeƒÔÁä< ‡‹·¹I€„—åOCB¡äåÐÒ¤Gó{Ò &„z60ýò©MÑL`ÝWÀŽÔ?ëxF]éñ.| OTk$hdOd „¨„B´äˆ˜@¡K  ÇšM@L„Š´¸²ˆ“ Àþ‚tüŠnKFxÚt”q`æbÁ.jÓ!Š8ª©Ž²ÅE]´XEJì‰cFŠ%dÉ&½ š0ŸŸ,;ë+ ªµi¸ð}; !ñTÑÊhßÑRàxã–!îîÏ—ÞsÄ“Rʲw5*«m»,lìûjª¯~—Ã4ÞÛˆâu:é­÷©I’åLvÕºjŒ‘Ñ4ãB[Å#ˆC}÷ë×t6é Á ó'BNeÚU¥-ÅßNý»rNˆçxí߈‰!–#¬U:àa]:b^…’fÔôµ¶>*P¹˜p…Ä(""÷2ǼŽ n”/hV^²›IÃqÀZimnéfí;¢D™¨°Nz—D8×µ#4àçS¯GrNQE8‘;ÌCe9ÝT“·‚ì\‚^n6(˜¤ ™áaëÂ=w´‰Û-V§heM¹GûNñ7僓“§.Y“™ƒÙ8^¯ª¦fÆ:vRª †Ð¥e …‡ Â[¤/F‰O‹ípMX&¨š:Dl¡¸ðÁU ‹š;ðîîŸ ô2©Ðƒ kÀýÜ«ÕÃÊéæ–2ÀÕÃWTPQvKá场£[Cc®¾œµæ«§zÎìÕ=VíñÙ µºö8s{ÏWº9lUê¯}²YÁz³+Öª™´ÆÆ ¤B¯]bæÃνWqR¿‚™¾î«…e˪ӨY Õ*Qeê¡z<¬é‹œ”Õ—ÝÓ¡R¢kÕuQÕBAÒ”Ú~es³§=:Dñ׉ªá$’1Ö£*,TWpˆoƒ¢]³#™7×=FW“®©zÊßgM¦§+ Ã…Íœµ ®ö@[·†ð0â5½$QweT0ª(¶3I¤«ÙAluÜ]­·FÒª6T‰šîîÍí3…é£WK1qàp‚DÒqײD;+—#NNMbmÓ†+V”xŽFýÍ5#Ò¶a²â-Sè rª§—⎇tï^Tì‡îWqh9MxŒ&É0ÂL$ÈBî¤äÃBR’ŧ¼;´ˆ«Ö›Ušu4ãòƒxÎ1Ä °ÂɲÒZµ˜Á0PPxLSÖ50•Ut²`¤)P™Š÷5¢a  Ç5$Ü-.æÁ»$†›6 ŽVòe´$ÉQBìæ&.ú£"ˆ3dÃP(‰ 6a˜e6.™ç£^'‘ €2žUŸ&k+ZÓdE‚ª¦¨˜í[ÕÖ¶aÛŒpØQC6ʶµ¶ YŠðéÛ§.}P‡kÌ›½Ðr'1dšGÖÛ”Pû79d¸©@tÂI'Ñ*!è$È좘Jªó ¼„¶d²#™v-1ÁdèÀ»©üž¯O_höë ZÐ?‹×DUDXžØÖ]z! ¥‹JW›á‘÷omiáw*ª§­6Ç’0Ù#7<ΉѠ9G,0YŠ¢ i0„! ‰’Š)ZA af""â1Ç£âveP(Ò¢ITT’«`^AJ*ªªdP¦2”ÎÎTvÜåL¨¯-5rh²²i©vÓ5ËV®y®HØIÆ™¼QäCÛ00"ŽÒ{—q|2HG{j¢ZVÕbÙ*Æ4–ÆѪÚ÷š‚Ùúïô¿à|_D‡sÑu‰Ùé#'©”;ÿ)¤å÷*ª@€yIæ‡BÇ a¤Å#"3žó ?>^å*aØI''ÍÝ&–H‰å«Å7™5gµQdˆÒTbŒò˜™JnëéLÍ;''žÃ½G¶S¶øÔ½yM%BTˆ ÷ɃuUG|`Í”ÐOv:»¨7DQ@Wº8 Ÿš‚&‰1äã T“2<,œÂOÂÂ<û?{Ù¸¯b½„˜„ˆ“ñI∧yJ¢UÙ(ˆQO¸QOOPåí‰ö!ô§ëÞþFœáxÏãâ’dJ²ÎÒ@=ꈤžÕCà‰‡~*‚idH|ÃBcv"z÷íEì ƒ«„ûâ¡â$0’ÈÂÄ "A JC¡ J¹TIiL[±’³ E°ªÊ$ѲEKTm2L’iFcM¢L3lQMFX¦Kb„”[Eˆf³l•’*+[ª|]•U>t@¼:l‡ò1 0D4ÅRD{ÛšûÃú„íìvÕtÔ·ñè “Q¶1XB*ˆO‚ ïCÀZ÷¼¼yy¿á{„=ø~kB*Yò"õù\r @RWlÈAÀty:NȇÀV Œý|AS£Ä| “tŠw©Ù@–,©k…§tÜ‘#$÷"OÄŸ€p>h©¬Œ‹»ØlkN2LŸ0ú003<Ù*J(žØ$)îöBxðLûÁ¸‚ï‹â ½ÔÕJ$š³$Ê™’!3 1— ²=“¸Ä!Œ’gï eGÔœ¨ž0~ïÊÚîG›÷(«;ýÏŒO;Hþ•€Àª© >Â^F:‚ðÜÁ¤,Œ™†D"…®rÛ›V¤–fÖÂkMLKGñ¨Ø›$˜º—ýŽ4!Ý·‹{.&£rVµ+å@+HCÄâ9ÆciÜ•URÏQÙ  VBs$ˆp9šÌ'ÐÔry ËŸÞ‘$©(IÇ/çe‡‰ÛŒ ¢4Á ‘dˆ¡·Ãß0!ôÁ¥ %d+!8$ž:ñü²æء߬V2?ª8G“ó±? Z{Ñ% Q @úÝÿók×ÆÛ¼»,ÍQšt¿vPWJ+æ‘õH¡ñ7Eü‰v ¿˜§sÄQS÷ë=|ùi¦™iMŸ&çÕõb~£Û1+Ø‘ýáüøšCÖbÒ´§¨“¡ðë¬0þ½a³O °ûáæ`~µ?Óÿ½óÿi þ›vZ*#xÏÿ:ÿ7ÿÜ/{"¯øÕÃýžC _ó=/ø›öÒ²ÚñµÕííázéu\=†{C ^ÆKÙ¿m+4òò’£Üõ £ø þ›DFÅ’ÆÄS"¨ÒpR?<4PëB‰šÔËML!ANLþ|pÔ 8&ÒЇX1R囜Ènsšä„[’Nç3®X´šp25˜`FDI2FYL›N0¤ Z°6À5§" ƒ3 MX”ˆ.f8ÆŒ 1(¢#(„X¶ô%‘,¶ÒMÕzI!\\kŠÛ†D’UQ±’B¤1 ¦[k’ªð¦ Ý’Ñ-AlÑRM(bÈ Z"`%ØÓ™Ùš®l[’R-Ís‡)ÎqF&âD¥rr\æâ`ÙÄ· È Ã12k 0šr3$ÆX“—+œmŵra5%HËEP©¢Ä$Àér¦#Zb@‰"!¤5ãáâ4ÿ W÷ÿÓÿßûJFÿõÿ8Ua¹ÅÖÿ\³þìðëå áw7-ï;p× SDŒEò€¹ëB½´É™€8} l¼Ç§qÙ€.³`UF©Ð: ê¼z«Ýä*PnîÓ°{;î ƒ«¼o¤¼¼·›w»•Ø{ëÜóŽæ|±î¯]÷ÙÞ`5Wž÷Ÿ;rÑ úõ뫆élO­Í…rî÷kÛ{7;sEjy÷ž=5ï¾î·yÞƒÚMXXc6)±¤É¡¦fŽ\êà “‘¼ÐÀð@t‡¶¡ÍÏ­ð@>òûPª>LP´suph[o­Ö—³ rj¯yÍ瀅vn˜J“UŽŒ¥L÷•«%B•¢7.;Lîž6gw›Ëx‡¡6·×º=Àò»Æú¼{¾ñóä€SÛ ¾VÖ„EmªIÆ* vÍŒU­6Ó¾7(ÀÐ] %{öx ÖDR”Ž±ØµJ (@1QB@©T¥)B$©I (%J6e¶5*¢‘d%*  j½†€äzzzªE½8 = A )â­(mE{q/xeÉ»—0ÓD3TA‚di1¨i“Ô©äô©ã6ŒjjyO5OzI²@%JDB! ˆýSÐÊ›SÓSOÑ Ñ‘  7©T…Q馧蚇êj4h0#C@¦š $õRA& “M4M©OS4šd hRRD44šLÔÓLMM¦§¦BjoTð¡ú4 ŒšSÔÐ@TI ÐLA 4“& 5OLšž“Ôz›j›SA§¤ôi2z™4ÒÿoíûÿW½oÌ­«¥Ž¯çsª*]º_Ãí¯gôî¿ëíÝ*OýXk¥y¸ÎtÒÍŽƒ—ŽRN˜å­.Tq—+eÈåH¹eÄc­qskY©-Ji–[gpX+’iÎf£G*ÿ~IpåuÌâÌåq¤†S%˜¦rZ§‹C.R]J&ƒªuON)º©%Ú“%ZÆÚØØÀÕ•zÿ†¯ùºëùÑHo¿ýû'¬çÞ“0Àu³yWa*ªª¨›·bi.Ìš\ÚšlÙ&ŠÉŠì7v.©6+³uUM‰«ªÁv+ ŒØ¦®Èªª½a»—Czù~OØï+ȤjŒWôõÉÂô³‡D$Z?ôädÚÛ&¢µ%¦Pš E•E’¢´J@*MM¶²±’Maa±Z6¢ÅƒLÅÄ6+h´f”&1OÛÿíÿ»ïj´ÿL«üõKÿ+U,eSTÏú1û¿ÖÃÏwa‘,| h?wïþïÿl®¢Hÿp/ßÏú†îI`Áƒ /n·Ûÿ/ûku×'1ÑJÃþcýÄ eèDoßñkg—<†¼ÿñB·PêਰÎRÂý¥b¢¢Æ¢hüK…dÝYú-ÄŸ’ÿÆ‘üZ¦~#ñ[o¿6²7$’I$’Uƒ®qÿ^xqú¾æŸ¸f`Ý#VíÄ÷n°ÛÚGÉóýâ`eŸGÝýÿ—òüµUQÄUULÌÌÌî¬eâs$“ÿ†üd“ë¬DDDDDGDð$Ž}Emézó{oªß‹Äb-èÖŠÚKI¿º¥ÚÿùÓüüüÁ*T¤ìûÏ¢áÕ¥½ìI$î`3¹$òü[í¡òwõp²'³ý€¿ÙýÓ9÷iå×Ê’I?½`ü†‚ ðówz{¨fÁ¢Ì å›ìòÜvûàõx8Ô1ù£ÞñåVôÛ¼ ÇoiîçýÝ×ïµ­”]ñ3Jæð“Á4¯ÂS2‘6I$‹áSÝ$¬Ž*Ê/r^åÝ$’½Éªèw^?ëËàÆ6éìô ·gŸÃ,¬ÍpãüÇý@¯'x(n>?`þPvƒ3}—‹úx£ýÿËù?‡ôOñGß>øþÜ0?àøê§û4Ž¯gGéþž³ý?ž\ü6ì?Ç·ï÷ý-³—öÿ³öÿwöûÝÿéúßYTÖ´ÑTÿ¢7°¥“}® ³u­‰øí²|Ö}ø~Üyöþÿwðz $Ÿö¿ƒ»úõ'!ÿ¿÷pþçoíNI2&fnÓ.I2&fnÓ.I2&fnÓ.I.Ngø áì¿Úþýçç·Ý'Ôúß×çÇ›ž_½û³ò|‡—ïùûã2dðážwË3ZrŒÇ~7êۻܒdLÌݦ\’z}ò½»-rßÇü¿Ãwê‡.·æÛtA9KØ Ì¯Ûþ#ü?¬rõø}å8#ãøûëâöy=ž÷wöþ¿Õö¾~î›´_ù‹ý¡sÃÚbcûF¿ÕÊGÓôt„ ¦µ¦Š§íì)dßkƒlÝ}÷A¾ŠÕqüÞó~ù8ëab>«~/©¿/í÷i¦ñÑþùãÚßt‰éú`dO³!¿»²9ú=}Ú÷rôpþ>üøkýƒ&ûÀ[óxuýýÞ2™„ÌþŽ×›žüYšûßÕÂ?-KvWÿbl—s‹ýNÏ×úû-ÕáÝ¢|#qGZd ßâÙõÇ×ÌO[crÏlQêý"—Ëõ¿ 0›»ú­fÄ|ì@ëcæívé>â×°ÀÇí@³H‡þÏñ#ˆÐÝZ078÷¾·±¶šÀ†!² h†ÝÚ<ݽŸ¬ø#ë‰ü£çCì‡Òþ_ÃøöýÿÍüž?Ïþyð|=•ìyí¹ì^_òc'À<€ö­Â‘~püÀúCy»}Ð<ãñ€ã«ñFƒË`P»‘¼÷Ýê7£àA¾é`üÿÙì³ Ü;âªýd˶¹»Cþ{þ<Ñþ¤V?ÏÙÉž}ª¢ Çú8wÛîZã­jwƱÆ1M­³,@ÿ~Ÿüÿßç¼tç'ò~õîõ~ÏòÛèé$éÕêÔÿÆ¡8² ÿ^¶ì›Ø«Ø‘l@þìóínÁj÷ O?®¤ÿôñíÿåêÖ¿¾Ïf Oïkû)Ö@ž<ÿƒ»_õwíÏÏËüˆ·<ÿÓìÝ{QöïÿÚA¶YåÕöMœž ~¡ÅS3u‡ãàÙ×wûž¨þðÀÕ/§Ç½Ç}z»s#HÄõã8ßØã.æøßÑ=ßèwgºä PÌeÞF3oá7ÊÁ—~…£<4_>jä1œÉ"mŒxWù¬wf©ÄÛ kœã¦Üýÿ÷rö=<žO‹5ù·õßöñãÓí*ÿaÊO¤ü$ð:«‹ xû/ÕrÛÖ[:P'ù UOú·î ¿êÿ³ýrð×ÿ|N~ÿ¿þ?³ý¾¿ññðñíãÎI û—$Ç ìéËÖ–yÿûùôí¶Ûm¶Ûm¶Ûm¶Ûm¶Ûm¶Ûm¶Ûm¶Ûm¶Ûm¶Ûm¶Ûm¶ÛcbII$HôçÇ«’@>?Çãñö{6Ûm¶Ûm¶Ûm¶Ûm¶Ûm¶Ûi$AµV{±œÌÌÏŸ/8/<뮺믑…h¢)0TjcT¢J‚bh´Q£YŒYLѨŠM£@Š«)cj)¡´ØÛkfɱÚ‚ûÔçr«Á—€Æm­ÎQ,u«6Ó¯Ô"y¡âÌhM#LÀHD¡ ¤—}Þ{¼s|Uìu9¤ ‹ÄÞ÷›“kÞÖµ­kZÖŒ^7ÔÍUUUUUDS¾-ÅíUÁâo{ZÖ´«ßÅ+cÅ­kZÓ;¯'}ßó®sÇ^/¶Ü'x&ÔMÝs{x‡½øFZ^Ö^rÛm¶Ö“KeÒélªÉ2é-¶Ûil¶e¶Ûmïåèó¹ß;{°m· _vóyÎ[çk{ë9aÎ@<€4ÌÎΕ=‰°ÏF×ÀœkcŸ:Á¸Õø?E·Ýi°^¤’|ÿG}g}uÙÕçŽs­éÚ¶Ûm¶×áx•2ªªªªª¢)ߌböªO{ÚÖµ¥^øÆ)[Æ-kZÄÛ‹F-‹ÞÕ7Åï8ªª©sFÑkX˜x½bñÁ2¦Rp°ÔH.+}³¦Û¶½sŽwßžrüW¼„J„Oþ—‰£ùt%¦Ql‹h™ªµ”ƦÃ3f³51‘“#îc–´¶F²ØT¶ZšÄ-)Œ3Q­* ú™û¾yú«ÿWu>­ÒH“?ï¶:R³/áÔÖq""aû¬Õ~ƒõ};?—¦Î¿·3œ~kàŸ·,µWÂ$¹¶Ö­«ôT""#ãsÑçê¾Igmü?¶ê{vÙ¤îg}óé›gB!qµþ,×¥¾3¶ý{~ôyû™?\Gý£þ_GþOÇø¿¥œëÕ¬ºþrY Ç·Lü mŸïýúÛ>Ö™”¬!ÿÞ!Åô}ß4E’!§Ë×÷¸ú;þœÒq_GŸÍö+æüo—£»Ûðþ¯†úû7†úâü)d$uYñD¨=‡¹ý7ó/¿î¿wáIâž_Ö’!õ1„{U?òŽŸlD ¸žž¯6ßÏÓÇéó<ÝÁø“ÿT½ùžÏ÷¼«ìôøGø+,ð§ò¾“À©}ê’Ô.QK·ïùGåú½³Ó×7žyºÏf’~w<šõÛ/!Ë»ºX$rG~Xȿ܆n¤?õâôÔ¸`Vñ†ÀMâmËÜÝû' 8y76Hü{¦ðÞnÕÛõêOØ¿¼¿¼¿¥þ•ö{D×´¼ý’{=Wªõ^«Õz¯+ûKÓؾ?4ÙÏu]׃Âì/ ǃþ'ß„.è]šGFÒ6á¼Ý·,`DÜ$ùÖý?s£†#NuÙÀZwcçûý39âo?ºGNZo7“Ý66›F'\2Y×jtêÃ¥ÂuWWg9]„Óqs‰Æúz7‰™ºhiôr¶ó»uU“[M¶MFFkZÙ ™-²|ÐÅCïý_Ü­Àpïïï·¾£2Lh›fr_ßO½ê¦nƘ3ZˆzyË;üIäúÞo­üî^·ëÏœ’Óm¥¦Ëmæ¿™x¯ò¯¹z/ä^«Íy²×›æ§Jº¶aÛ55m“¦:i€ˆ‰×™ƒg=°>Ïð¾_Ùý~sœç9Îsœç9Îsœç9Îsœç;ïp°‡Snîé·¬¹&cךå-:åÇÓRã .TOÙþŸÙÒ1 1*úÈY$Œºý¶Uª}ŠÆ>F˜~–L)úVbÙoTSiK1‘«,Sµû}ØñòÆf>§^ojï7»_²þNœ_ϲK~â±RÔ´US"ئZ‹i”ÒªV¶RL›)³X6k3ÃrrÖ•bñ­*•~ȺÛFÑM«i,ÕZÐ[J¶¯š¾¹ôMtdãäþ|ûZ÷;¾Õ¼r_³(Vc3BJ²[b çòd!äÒýO??á8$pgð­Zµ´?ñù}îß/Òþ/³óñ$‚7ðOÇáÄwY$“Ë“m,ñú…¯YÛ»ÿ~uþH¡C÷#Ú?Ï^"žžï]xªQviqôù0 _Ó>oÁwåhŒ‹ç1í³–ÁãÕoQô?·^ÒÑ°ÔhÐ!ƒÓ“™qk‹ñÞ.Ìl€<¿EØâ÷ Á—#*#| E­k3+ñ×}j=ùXÐbpkàôeø~Uàú~ož¼¦ÿõÀ·ú Dù1ä÷9»üî=—ç¼½/Èö¯¹êNî-¾…Ùë©Ç—Źó¼\¹Ö¦üãžÚ p¿_[›¿½÷°ï˜àÛæÔ»õ`çîS)·bÂÃÔÓªÐw1pàoû·é» v›ó/Ž­æp4Ñ30ËãœÀáq‡ îlÚhª÷f¯Lœ]îÌêÌ]{È’E±_\’'c™±Æ§´ã÷È$À$&Ónÿâð|Oâr¿ÀÉüø~¼ù(«ýĨä¿ßwãŒvª6FWgûÝu]×\Z5i:þ½ú».ËlµW‚\ÿ_åù>ç•RÕøØÆï‚'ÁÃê|Qm²ǧÓß·{´í9ëó9ñÑÁÂ\ÄOuù;=Nºçx¯¡÷²ÚqZÎ\·5^´$t]’HÃ螧ö=^~¹ÛÂÂiï³nï[¿[yzy¶iËSTõc‹[»»¡Ö›<¾UK²©ãäøü>_¾s×Ùצ»âø6jC]µš‘dððHôñëááå=,ëåõ}æÒx¼Ù?¾UŠ¾G’z<•å#ÊG>=zšX«îœá¥Š±V*ÅXÍ3LÞ~~iæû™¦išfÅÛa°ôÛ¾¹N=·Ã è8z¹8›·oÑàèå ÀÏ·Žý<Ž¬~-ŸE÷~oï¸I !$ÿ¿Çó°_OO¦yó|¬$„“æä¶{{pÙ Ùr=iÂ:@ý8gaŠ§ƒólÙÓeÃkȘ ÌÁɾmo»xŒi¹Åÿ9ù>惺Ã,ŸO™Ñýln%Ü‚±£Fšn8Ñ·ç1¨¨‡9Ç\Õ*ˆ’LÙns†ÑQjsͶ׷÷‡ÉÁÁÎsœå5®9-¸5‘9ÄD@ç9Îsœç-ssœç9s‚·-Yµs¿xår¹Ë€[9Í\N9¤üçÇ·u] -ÅpU¶¶ý1ãÚˆèŸÏdœê˜_áxû5{«´¥Ò{¥õ-¼Ïî"""""'ywVï;÷¸‰Þnínó¿w;³¾ ¥Ý»÷s»;ê¶ ªÚM×}ÙWu›Ø›®ÿãáÉ[9WÛ],N‹Ó†8WÅ’[…ã†8WʼnÂñÃ+ŠâÄáxÆf38g Þ¤ÝwÝ›¬ÞÅÝ»÷s»;ê¶WvïÝÎíwÕmVÕm.íß»ÙßU²»·~îwk¾«j¶—vïÝÎìï•Ý»÷s»;åwnýÜî×}.íß»Úï¥Ý»÷s7vwÕlK»wãœåÎr'¥×{ßW/ »€Ûª]6è®6Æ·‹¯Êô»ú^—=yu:UÐÛ©Ò®†ÝN•t*ãlm½'^.xÛnó¿"zzW›¿™å¶6Æت-¼Ï=îwÛclmŠ¢×vïÝÎíßUµ[U°l®í߻۾Tm±¶6ÆØÛbÛ¼ïÞçyÝTm±¶6ÆØÛbÛ»wîçvïªÚ­ªîÝû¹Ý»ê¶«j³lUclm±¶6ÆضîÝû¹Ý»ê¶«j¶ •Ý»÷s»wÕ±¶*‹nó¿{çvØÛclm±Tm‹nó¿{çvØÛl+»wîçvïªÚ­ªØ6Wyß‘<ù¯73Ó=yÝgJºš]Q¥]Q¥8g8²n’*ê©Ón’@]U:mÒH@«ª§MºI¼Nr'§¥z]ý/KžŠ¼Ñs†páœQ½¶M.¨Õ¶M.¨Õ6êt«¡WS¥] º*èmÔÕ¶ÉÂç áÃ8£{lš]Q«hás¯N‡FýÒŽm²iuF­²it«¡·S¥] º*èUÔéWCn§Jºu:UÐÛ©Ò®†Þ“ž.xž'…]ÆÝS¦Ý$¼Nx¹âx¯om“…ÎÆqFöÙ4º£VÑÔéWCn§Jºu:UÐÛÄç!svìodÚÛ&•«&­£vtètoÑ\Ôœ¯8µyäå¿+Í’ZÉ-IÊó»ïJ®xmÝ$ UÕS¦Ý$€ ^'9çfØÛclm±¶6ÆØÛclm±¶6Ý®Þw—u³‡%7M.™”²š]3)e4ºfRÊitÌ¥”Òé™K)¥Ó2–SK¦e,¦—LÊYM.™”²š]3)`阌¦—LÊYM.™”²š]3)e4ºfRÊitÌ¥”Òé™K)¥Ó2–SK¦e,¦—LÊYMÓK¦e,¦—LÊX:f#)¥Ó2–SK¦e,¦—LÊYM.™”²š]3)e4ºfRÊitÌ¥”Òé™K)¥Ó2–StÒé™K)¥Ó2–SK¦e,¦—LÊYM.™”²š]3)e4ºfRÊitÌ¥”Òé™K)¥Ó2–™ˆÊnš]3)e4ºfRÊitÌ¥”Òé™K)¥Ó2–SK¦e,¦—LÊYM.™”²š]3)e4ºfRÁÓ1MÓK¦e,¦—LÊX:f#)¥Ó2–SK¦e,¦—LÊYM.™”²š]3)e4ºfRÊitÌ¥”Òé™K)¥Ó2–SK¦e,¦—LÊYM.™”²š]3)e4ºfRÊitÌ¥”Òé™K)¥Ó2–SK¦e,¦—LÊYM.™”²š]3)hÝ3)e4ºfRÊnš]3)e4ºfRÊitÌ¥”Òé™K)¥Ó2–SK¦e,¦—LÊYM.™”²š]3)e4ºfRÁÓ1MÓK¦e,¦—LÊX:f#)¥Ó2–SK¦e,¦—LÊYM.™”²š]3)e4ºfRÊitÌ¥”Òé™K)¥Ó2–SK¦e,¦—LÊYM.™”²š]3)e4º“fÙ²¶©6m¿C£~UÍIÊó»7Võ&ë¾ìÝz/om“Kª5m“…ÎÂïd›®û³uáx£{lœ.tåЭÍ’uèÎœ1¸²N8g1Âõ^hÞÚ9åšåŽUÅ’qÃ8Ꮍâ¤áxÆf31jõêtoÑÕ(æÚ4º£VÙ:.bÕª…èPz $€(pH5@P½ =¼€«·U8« zNx¹âwm‹oŠ»Š¸Ûxqjæíóz6£WTjÉ»3umRlÛ§Eéwó<¶ÆØÛÞ“Š¼º*èUÆØÛzN¹îõÎí» 6ê 4I$€.ìú~]´{CA„ãâåáòXI¶×“œlÇàÚH#ÝŽ~Õ^ïIëþ}¿³œÎwˆøËMïÒ  ‰j D?’ÏY}­mŽC÷¿Â#j{ÿ‚rŸ¡®!ÙRû§©º|õw¯½^Ìäö´·Û&’. E¶»Õ{×{ÎYß]çæô¿xñâ*‹}ÏH§{Yû“ Ÿ¥ž€¾=Bb*É$’Fž»wNíî­ìU’I$G{w}øvM*õA0K‹y|jÌÁ ÜNÃPX¨,IÖ_Nö¶o‹=WŬç:ût»>i¿GÚUUUŒÌÌû#ཋYbË,²RTÉ©¤)âkï*ò™ý÷§›­¯:Ö‡Ð7yç°7ÞÜ=„5Ùµ;|›ðﯭÑÃâôÒý#~nÔEA‡ÅmÏ(˹ºÇåüyz‡ÅåòÖyçCš Ÿ–Š²I$‘¹íf›†ïgéø™ñ’{zzµøóðu›§ãTª•® d–<{üVdûa¤Þ¬’Iõ‚fa˜õ‡¨ÁÍôÀ“­Ë›O¬&µ­¯®F‰¤„¤ YîŸ'6zέ^-4ÓLƘÆòÝõç8rÛd’E[ÍyÉÉ$‘Vó]›¼åáËm’Io5ç'$’E[Í&gË»»»»» !÷l'Ý}¿¿ëÏØ-´2èbÞƒ³×W·n¸åå*ÂWã*ó¢ú_g‡UÖ´×F¡õy¿çö÷qÚÕÕí“ZÖŒ¶µž½¼ÛÕ;œgÜf[†e–µm““ËdmöÁ8ÎÝ‘É‘æóýöÚ±ªõÝ©zöóÍú›¬ÞÎ}¯¸EŽ¶Ûm¶ýdïr}„žï§§° ç%²[%²[%²[%²(¢Š(¢Šõªómµìª¶0ýÓÒ@û|ݲ»‹Ä^ÎnY€êž~p½æ$K""åëø‘|^ǽ|9×9Ïwv»î€Z0ãžþUb.ìâ]³Èá¡Ô;»»ôê~•˜ðIãö~œÌ̹OÏñîûߣ·tôúžn^lcÆ1ŒcÌÏ=ëw›O•çdž¹$N=MÍÝJó ÕímÝç×R=øçíÍ—n>|A¡¯«ñ~Ÿ›Íïü>ßÉ÷ÿ"I%ˉæÎb7oçÏîÃâo›]›µ¶Û/å~tævö÷>浤,²ZªùK&gfWâà.ïŸÈ}xÝ=:{$’N‚z~Ÿã–O²œ×ÔÙü~Ïêûÿmò~T:Éz|'Ž2uôï¤Dü}¿yÎns‹ô¶×Ú¿é¾k© Žôú^öó‡n½¶Ë1sÇ|›5¨Û\IúÓ¾wv-m© Ž®¡ü-~úüßgñ[§âü_‹ÓóüÇø*ª¢ ˆªª™™™™Ü´eÞs$“Úß÷$˜×]b""""":'$’ý&fbÖ—q{ÂÏ<¦f·ïß¾µ¶çÞ8ìãLÍÄÏ ª¶Ûm¶\E­nV­ùåW~‹F1ž²ß¼8ŒLÎY%{Þ÷¼ÌÌÌÍï{ÞöâN­ŒcpáÃz5Ï<óˆ·.‹[×]uYoèÏ¢Öµ¢" 馚i¦hdrË(µ¹;‹Þ5èÀß¾fkm¶Úµ¿sï8Æ“3q3§j­¶Ûm–@È^÷åe¿LâÙ]ú-ÆšôZË|G&`¾ç¨€{»¹»¿lD;»»ªÞ—woÖx÷¾:é;-¶I$U¾5Þqã»»¼DE®cá¹,@Õ™¾_›ßff é2Ac†¦pПK=Ál¬ùùb#}صµòh~ÛüV‡uÀ9žD[ǧÓvI%?Gé]>N|‡’IoGGMÊš»ÛédI/3&4?VÍÄMÞ[~ï>Zs>LòûnÞSÊ"""""""""!ŒcUVæf< úS¢m·iî²H˜$‘êOä|\¶MI*,’›÷mž½kY™€· yû—åO ¤¾]æ[õýåø6Ëåååõýx~ 4ùÌçèü/ß]œd’I#M‰¹$’r 7¶A¬uz¸»ü^n^N¬bØãĪvi»«d)¼áÂœ8$8}úsÍ»«!‰™½åÜœ;âfg&]æfgùÀð# ,b<+#'::Ó®á×W®íï£:ïœ{îÛß]™é×]QU{ÍÀ’­36µÄˆŒLÍï!°ÔÓ{Úâf÷«€b137¼†˜‰™›ÞCa©ªM­ŒE¦ÖÀ¹—½æmkLÈbZ÷¼Í­iÃZÖ¼F ˜–ãä°a¾î,dHC £QPL áÞm¹^øw&H˜Ý±‹eO‹Ü˜À' ¦I›2âgž|våæób»›«çñƒÆ½g±b&«ìµ}­mµ|>~9Ç.py7œÙÆXf`Þ[äG—h ã7læKìGœxŠ‹žò)Êϧ–>ÕLs<~±çÐÀa§eûˆ $ñ9ò¶Ý¦Þõ{®/Õd‡«D:ß«øýºH" —î “LÍ,3‚Ðä–`Ì$›6Œñ¿±»3—ž$Š²O+ºÉ$’I'â<æ[áìøu×RI"­¶Ù$‘VÛiÂi»è×à>OÅÀ`×ö™¶C'Êѽ†Ÿ8ÖÍŒO'³rð"Õ•ûÎ÷«ôe·ÏÓËßýפ÷yÛ”¶ó—M¦ºðáòJÅU‚OÚ$‰Œ*­é™™™Z–ô†ÌUr’¹w÷Vµ—.~éÑŸÖñA|¿¤ÔwÛ[[d{ï(8À/ m pîÿzaƒ ½›äa ‹ãöû»ƒÝûêüëìù5~?óÇ8åÎw¼=ýþ·ÅÎB&ɳ6Ȧmwç,®5Í™² JTÍ3GUK‚.(ÝqÍiFY2T$À¯¦o›æ[ÔÌ·ÞŸ ŸÄùNܤÞÝÇ_½Ù¦˜Æ1Œc6í¶¢¬’I$iómÝðzzd’I#í±87ÃʃÚîQfhgí6óç¢Xwy{YöÌ·e¸¥ÍpÔ­Vµ"N"I²÷=çI-žE°§m¾'»;Äñ%ŸqÒ|~½zÍ{úO 55mžÛ—'×dD)›q L@•['«ßç×ÔüWàû¬ÒÂÏãïæpè± ¼\îÛkδ‡ã®/iÒ™q^Ãs¡Æ’Þ{qÒC­^³_‹¦sJ²ÛÅïu“@›º6ÏŠ}}'Ø<º~¯>ŸUæ®$9߬›Ú4²mrƘA1$ìÌ̆¥/[;½Û NöÛ;µ¦ø¯^v×>B †¤îºuðÍ& O¯[®×¡ìüšoí®©Â=^¿?¿ù~ûñµ&çÕ:¯³õ#m'§W„Oíß ’ Og»Q=~ýÐ'ßÛµã;?Íg_?·—¸'Òšîìá ­ç~š?Û³M-Û‡/º²}N˜´ÚÇ—»¶¦ß»1ËÃHãÓ®¢BWòcÝÙásÕÀèbNŠk10LÈO†€‚1Å[ºžï-äüõc+÷ìØž±ôx§&Ï,p{<:O/›½ãªy+™k5ñÛ•Lp$xŒï€ 8Ä*‰$ž`47,ï§Ê¼û;žO'¯â.×¥í¢ìÁ‚2rÖh†OJÊ[$W©|øk‘ì\æÍÇÀü@8pÞ‡ôC ÜmÁ|ƒ­k cO/Ÿ–£¥>ÿ§]Ð%ðö¯«<ñ½ç’D¿b-¯ÉÇÛo»âõqÛåì÷ú"ÈD_vD{=^{ÿgføêlÑù<1ðÛÄ´ÕË[gŸœ„>©mžþÿ]ë¾Æþ;A#£ê÷{¾{ë¯LIè²Hžýýöïã­[´ž÷/YV¬!'ÛŒ‘÷žr:퀳¥ç»6îîàg5QŒ{>íÌŸ¯½Eǧ;N¯âïíÙj­Þó¿L„4OÚ{ë$T<-{9·–Ô²s7'7Âù~ãÛ»\ñâ¹oVß^Ë|×Ü®^××î÷ýÐj­öúãÝî>úùæø|Ï¿|¿¾° H ×o]-·gŒï_›o¢?zÕSôzÐ%‡—¯¡ìv“jî¹™Î/‡³áïy‡·|ç|õ¶²Ô«íöÛéä'^u×۷Ç—0nôEB`LOT$ðáÕꕉ6}gÕm¶Úyyrðk\‡à™™ƒ3qaŒI/ž¨;ÌÈ®KÒ*ÛKm¥¶ÒÛim´¶Ú[m-¶–ÛKm¥¶ÒÛim´½tu×][im´¶Ú[m-¶–ÛKm¥¶ÒÛim´¶Ú[m-¶—®·t3C7¬3°ýl!õn{zÎý ǎЉb3f/H-2Ú1·±ò@<@ÌC330ôIA¶¾5W[]CÅ-†ÄûßTyú;¸lÃúµ·›ŽÝ½_G­ÓtÛ[ÇÂ#{%«gG—[–téÝã{Iâ"LÈ :gÕøe€a†$±.âFÿÃÝìj'èô|gèûsöÐO_{ñïå;üŸ…úô=ß“äýO9ïôöü¨ª*º°’:°’*ÉXIQWÓö9&îêóˆ«é‘$“ô€ï®À~­7ô¼ÌâØÑÅ-ú;dI$’I¶ú$‰Ãö©ž~ë¯Í{úNÇ?ÌÎëm¶ß¤H•ú²•F~º¿?â7øwŸË¿ƒ'u ù?®ð\öC·ÏùñvïøîÝ®­\åËzosÆ1ŒcÆ1ŒånËv¸¢$1,0$<_á“6A¯•ÏÌÙµ33‚;;WŒŠz‰XDíÑ̳_FÀ׆oãv@Ÿ¡M9??ç¹·©g}ö´Ï¢›èwy#õêr!iæñn˜öŸÆݶôÎA#¿/]ûmÍA·îz;ÛqÏó NίkÓÕÇi­[Çe÷Yo Nçð¾( F ttZ¿ Œçå ÈóêNÉ /_87n¶ªÚ«j­®óùvþ«m¶Ù¶ÖÒÛi{ëwwww¯Op| t}÷=tàJ`øs´óâMï }êõ¬7³Êº{­ÌTégkëŠNMïiŠpÙ•§MI¹µ»ÖëÝƆ»×κóòˆàó醡9¿èO“ëc–ÎÝ7Û?‡^+çáñsô%ñïGx¶ß„ÙÎCtAÀà[n ûÁê˜ïÒw§_^6õŸ±EJSŸŸc%oÒÜMÅ6&é‡ïpÝ÷0ë§ÏàÂlætõÜ›r HÒRÒÊ©ãã›Á˵ûú•,¤ñèò©kì¿wwvwYòþÓû:ÿ_óý½ÿ§Û{“{Þðïÿƒéú2*Ö‹Y%Ř0Ûǧǽ.&ô˜éï|Ð’Fò'EÔàÙÃ}e¶­|Ý9 :ã¯ØŽªR«Ný™Òüýç ÿ›`qÆeÌíà"÷kªæìcK1 *ý³tÃPx§ÃÃͧ—¹³uZµŽ£ÁÛú¢àt훵$I$S†`gˆŸ5¬Mncü³ÚtB÷ƒ¯sÇozgww~îû No{ׇ<ï¯!øN0Ô§[Ãi$OfÝÚ{'ä1Ém9¦ýrs²ãgg V­vy‡¬—…ý?£è¿å½SîoÏ™Cg»Ü}Ÿ?ä>km-¶–ÛKm¥¶ÒÛim´¶Ú[m-¶–ÛKm¥¶ÒÛi)àÌ.àz`»çÎïÄ0ÁÏjM¶á[§Ãž»wðØMÒ ªö'i$K£ûºM=oÊ’G^ï6äÅUYm•[øø­·‡tƧ7ãÓ »ú¤™Î™ötô¦ï4 úŸQà¦ùμðÒ„àÒªª*Œ„]1¶›]£] vv´Ûi¶Ó¶˜‚ÛLFÚ`’QTUEQ’Q’A6ACi¶ÓdA ¦È ‚MA6› ‚ ‚m6AAÚl‚MAAA6› ‚m6AÚl‚ ‚!´ÙCi² †ÓdCi²!´Ûi² ‚m6Ci² ‚ †Ód6›m6AÍ16Úl‚m6Ci² ‚ ‚ ’BHI TEQTUEQTUEQa"Š¢¨ª*Š¢¨ª*Šˆª,$QTUEQTUEQQEQTUEQTUE„ˆŠ¢¨ª*Š¢¨ª*Š¢ÂDEQa"Š¢¨ª*Š¢¨ª*Š¢¨ª*Š¢¨ª*Š¢¨ª*‹ TEQTUEQTUEQa""¨°‘EQTUEQTUEQTUEQTUEQa"Š¢ºŒuê1Ôc¨Å(ª,$„Ž› ‚MÚm´ÙAÚlƒÑ;ꥉ»Äö=Ï}åãïÃŒH°Ô0 Àµ./Ñ¥Æäþ%zE¸5ZË®€q³¹áí{\îî²=½Ý<5·]þÆÂzQ8ãÌœåÚõõAz ´²5Ën#<†lYllllll|ºþ¿¼õaÞ0ݨb7ßiÝîæã+¥ËÊÏ›Ñz 4<Û›jýc1òñg½€nó ÖÖ<3w°ïï½€ ¼îý“§Ãtœ3çÑÔàä4W†Ç)$l’G¥íÞçÁïÀwï½¼|¨Ö­ëÚÏ›ø_)[W!øZg«<åÌôëði¶/?Hêù¶æjV÷ÓÑém»Íºk¿ðçÉò’AãÑöo}ýØ×rëž'¸ûÚð»ò!¸p&íY€øâã0vD_mÃ7wÝûûé×d ÝžŸ/Û²ã›~o„“»´Ÿ/»ßž?›||‰ëÏS®ºèêÛKm¥¶ÒÛim­aiá¿0dI$ð·÷nÍÁÛpÝñxû4Ñ0ð_͈ùžîÆOK|~ïQ kñ OxDŘ{à 5À ½ßM{›ÜOÑæòŸgߟ©õêû Áö çñÇ°kñᥴnë¿áÂw ž´à Âxp›CÝøþO·Î{ý=¾´U]XIXIdŽ¬$‚¨«éú¼“wuyÄUôôÝÝÝýØ÷×`=Úoéy™Å±£Š[ôvÈ’I$’Ià˜6Ïîªð1ï)²|É$’{†¢G`n@‚;E|Ÿ'/7S«O´¯#—±îió(ðz<Ÿ'Tñvw¾f4ÓFši¦•¦˜a&ˆ!""BM BDOCâp„4ÓM8pCM4Ó³²ªª«äÆïù;Þok¹r᳇{Ž¯7{²ªªªªªª«Ð’'Éò1àêù+O’»Ý°åò1ܪªªªùO3ã\²ÏŒæzK>WåxßÍyܼ¯…ïZê×ÁxßeöÝ_‹Ü|#äu'‰Øï>cCF4hÑ¢š4`à 4SFŒa†4a†)£F 0Á£F 4hì|Ì0¥)M7744hÑ£±Ø¥)JSä 0Üð<ƒäwžg´Ã“““ƒcƒ¾d§™Þa;¥)JR”¥)Jz "p>GÈaàu>E4|Šw Ø9>Câ” »\»9vwÓ|vhÿŒmS;FíÙ;ôç÷³èÆG'=]œçý2nòtû¼}ÞïuUUUU ‚I$’ $’J‘I$’”’I$MRI$’IúI$©’I$’I.¼:£–þÖ»>º¿o£Óð‚2I$’I$’I$‘U'í@›'k!&¿nD[ù-¿ÓVÛþý¿Gò}ÎsœáÎsœàósŸsÛÎsœç8·Ï³kì½k¿ßç>=â÷ߺ]»¶Úßsò_Ëò¦-UúC_ï|­ó ¹ \ÄyÀ•Ùäáí¢ ]¡ëˆùúæüusßçoœì!I•}Ï—·ù¶ÚZsmvU«{lé­é/?Ì Œ7ß~«¯l÷o‡£JÁ6E¼FB÷'×ÖÂÀ‚4ÓM:ÎÎÏ>pÒ3®›ß×ë%¶–ÛKm¥¶ÒÛim´¶Ú[m-¶–ÛKmٶΜó“DÄ‘6þSÃŽäsR,þðIô†ç—“Ê÷÷ÛoiÇ̳‡µômÌœÉm¼ÿ=·Ä…5åý ¼í«où+ÈB3np‡ëvïµÞ¹ª—ìò÷ ½ .á”/Cò¬šI#LŸ±yÆçîa¿š½oá~TjBPšƒÚÙÇ·£üoa­{·ôòèn­E€é=×|ù½03Ñuõl·ø?€µ¶–ÛKm¥¶ÒÛim´¶Ú[m-¶–ÛKm¥¶Òü>O“3Ôó3Û3SCÓ~cÎÏTàÏjŽðå÷;¤.o¤>\÷íÔÏž¤ôÕë¶Ûkm‹¿{×ãâD¿Bëgf ÕD“Þ²»30i–¶Ý¦„,XÑ»¼ ‡NnœÅh2ÏnV`HÊM÷aïßCsá³<?ŒÃ½ï¨¬ÇV«1Õ€êÌuf:³X¬ÁÕ˜:³Yƒ«0u`:°X¬ÇV«1Õ˜êÌu`:³X¬ÇVc«Õ€êÀu`:°YŽ¬ÇV«1Õ˜êÌu`*‚¨*‚¨*‚® ¸*‚¨*‚¨*ઠ ª  «‚¨*‚¨*‚®  ª  ª  ª  ª ¸*‚¨*‚¨*‚¨*‚¨*ઠ «‚¨*‚¨*‚¨*‚¨*‚¨*‚¨*‚®  ª  ª ¸*‚¨*‚¨*ઠ ª  ª  ª  «‚¨*‚¨*‚®  ª  ª ¸*‚¨*‚®  ª  «‚®  ª  ª  ª ¸*‚®  ª  ª  ª  ª ¸*‚® ¸*‚¨*‚¨*àêÌu`*ઠ ª ¸*‚®  ª  ª  ª  ª  ª  ª  ª  «‚©Š¸*à«‚® ¸*à«‚® ¸*‚® ¸*à«‚® ¸*à«‚® ¦*ઠ¸*à«‚® ¸*à«‚® ¸*˜«‚® ¸*à«‚® ¸*à«‚¨*˜«‚® ¸*à«‚® ¸*à«‚¨*˜«‚¨*à«‚® ¸*à«‚® ¸*à«‚® ¸*à«‚® ¸*à«‚® ¸*ઠ¸*˜«‚® ¸*à«‚® ¸*à«‚¨*˜«‚¨*à«‚® ¸*à«‚® ¸*à«‚® ¸*à«‚® ¸*à«‚¨*à«‚©Š¦*˜ªb©Š¸*‚® ¸*‚¨*ઠ ª ¸*‚® ¸*‚¨*‚¨*‚¨*‚®  ªW®í8Ðöžy:Îx0!Íœ;ë鈻‚{ÙLJ€à8°‹d6Ä ò »÷‘ÙSµímeË|;nmӌκ[9Ù‘¼°Ü]€.\ H-ŸVõÂ,ÙXV% Å€ë[ÍÝgM7ræöÐÒ]ìõÌÌ3ƒ}T÷=}g[¼ôyË< †â`pä@ì®q™zeÓ5¿—§wW.ˆO ¼ ‘¯=öåî±¥NÏ{‹4–3 Ó<^5x¯{+„ dtË!8;Õȵ–Z&ù‰âŸMg,ï.YóÆí1:ÕñHff†Ú‚³dÔúËX9 ùc ÂÒâX>N*p1m4l¥ÂÐh©„%Œ¡vpZF·¾3×I"·cž`0ê~·Ðæâà–‡ª‚,Á§k‰ºîžYùvõÒ4ÝêÛ»læý¾£¨à®RHÉ×I«dH9»L~‚ì{‹Fì3Mâú¾®¿c}¶ÛfÛmµ-¶–ÛKm¥¶ÒÛim´¿oÛïO‡“OÚºfûúpßá·ßG›ÝmÛÚàòy?­ökUUUZiî00ÏŽûyú>O õ¶ÒÛim´½f{ÍËd´[$«T·™Ç« ¿Ü&Ú—ÃóûãâµüP'Ó“Êv‡…N½½¿xBn–û9U9¥·mØDè…ö=½½»z^Zo¿á'›w%øgâ“žiômtx<‚AÆþ­ŸtÔîŽÞΚŒžê¯^Ü:8GëäõmìÝããV×ÅœËëm·æîqêö®X–㺠5,Š™Õdª¾^wŽÝ­úŽ•­œº·zEžm3¿ÏZ*†z«ÓʼnåcŽ™ŠÊÛ3.5¾œ¢óYñÞfÖ9Ûí}[Iªöõ6®â'%€âàæãv•ñÙÛauµ¹‘®Ã¢÷½¶Ûæ•ðíÆRz~Œ!µ!ø¼{väOÁÕ$á}=užÝm};ñþMå6²ÓØù›íë›f~dîýßsÔOUZ þ~ _ÕGß?›v£cïNŸ™X¿«3ûVjÇà±kú7»)ø?‘‰üo¿çàò߆iùÓJMªTOØ‘l’èßÃŽj¶¨lÚZü×~ž\ærÌI‘ÉÍ*MZãY6çm´5mQ¥ÅÖ+ñÅq¶jÌ*¨j^%“F’D,ÌѶeO×SY(ÇF&ɬFÓhWïŸæp§g§ÛÒua?ÞÿYJK“¦Á« ZkY¬HŸÑñü5º'jÓfûO㟺ӽiQ?ú„Oá ¸*OÂ4LiQØDàDÂ'9ÿôÿú¶ÿ-ºÞŸêcûÚocø¨õݯäÖvã};€Ü 32œôÝί¿û£Ó¿žªÉ³ö{9yÏIíÑw©¹ alÚN”á»ym†^L–Þ¼õ—©×P õ·——Ç/8ÈrÃ;Þ!v´Íž""#''6o0ãü£‹\Mî0(wlÈêl7Ý¿£¡vìx÷Îs¾nÞrÛm¶×®?'Žûªªªªª¨ŠwÅ£½ª¿+ÄÞöµ­iW¾1ŠVÆ1‹m«zguäï»ã¾uÎxëÇx¤ÖÙ&®]B¤šfc‹ZosY·…’Z<pò’{h¾p›OÍäüÕñ K;ÿ>ûø?É$‚?W¿íú¡Ì>»«í¿³ïÄ “øxüwí}÷è’—ýHH“_]ùïû¿ïÿnÿÝþIø¯'ü.u»ÿòçcÚÊ%Mü¦*5pE\!{ˆ\¡]d-¶ª“qª× S4lдSJiÖšZ+W9q¥¥™”lMÍ.jJÍ„Ll›E­¦¨“qµÊ-¨Ö3)œç&¬i±ª«8ã“Îdqf´ØÍ´DÆ™Ä5µ(¤Ô¸â1­¶fÙS™8¨M£YÄÁ0‰Y$4)²ÒÍ5µY¶³ ¹¹­ei P–i)b´ŠÆ’末RjÊbËK š3Ÿâ:¢ ±"Gþq^iAcgÝ÷_³33_çÿÍ·?Ä{þH€çà=S¼0×gs¿Üm{í_XoÔØl , výkæ Óù9Dxù »#éóïÉTXC×"ؽàzÓó¤IC¬}áŸÅkëí#3£ãú²gPŽ©Aý”(Ć•xjîÇò½ß+]¯ükçêGãðþ?“ø¯I$„¨ƒû³çí×iü~>Ðþy#Q;GÀh—3;»®óbâ÷åäèïú2TŠŒí×µ¢úi¦’²— ¶ëÛ+åÑŸÕ¦K1ÃJÓÏ$s8wsÍÍ žèß®¼8pà’Ir9,¯Œ¬õŒªõ–1Jè)¢M¯{ʬ+,%SP…ñ5Œbø•2±Œa]Z×»ß x™‡‚b÷™J’I%ÑqðÿÂúªÍ[1Ÿé¡ðŸª›÷jwKÌLN.ø¼†òì-û??Ç`Í)Ëq·§1{í±wÉ›†þ÷ïËŽÙ馃|¸ß1k YÆw‰œóÓ]Û·qãÀÆÍ» ö´Zѽ¾5öxøþžuçø:TôÛ§™õßèó®zB›¤ƒÒAÒþcM4Ód’I$’I7Ñú7R^y°r|žHé·c¹7¼sñÀù±Ï5ÛãããGŽåâ:öq‹caŒr™Ö«m¶Ûm²µ­oG¡g–I%kk{ßá²IE´»]£ÏwM¬¸Deßáú;1ø0.{ÃO£ÏùøapXŒúÌ ·š„=£ß¼\Û´z¾ÌdX±A™ƒ=¼Þ_/v]}|¼¾_*I%Èסýþ;˃ÆÅÏœtK™ù.-ÒËúþë¶vâMXFöFXM¬6·05©å}Û}ÚÛ£6)¦8o’Û–<ëÂ÷tã9^JÍö ï©©Óî3Ï=0©¯Z0Ý'©‘2[q2[q2[ºå¶|¹í@Ø\ ÷-uû–ö8u?)Ô’Ù5ƒß,¢L“"ÃsŠpH{wàð†ìù4÷¿wÑÖº<ß#ý¡òTüW§µy|®ïåÏɧ³u“¿þŸOîb>Hø½µ¯åÐi·ÁÕñüÇñÕUUUR$’I ’I$©’I)I$’DÕ$’I$”ˆI$©’I$’I.]œ·GFþæçlt8¶oÅéõI$“ïÏ÷«×‰?¢=˜õ„’Ëzñ쿲,Ií`µ h'ªÁ³–µ†i `òƒÖÀ†€78ñ©kÕÙíVÍÏ΋bØ´ŠX» űKd» űKd¶)bÊıebX» Å•‰bÊıvA‹H¥‹±3jLÛÄm<6¤Í©3jLÚ ÅÙ-"–.È1vA‹² [±i±lRÅÙ.È1lRÇRfÔ™·†ÓÃjLÚJu)Ô§RJu<6êfÝJu)Ô§S6êS©N¥:”êfÝJu)Ô§RLÛ©N¦mÔ§RJu)Ô§RJu)Ôͺ”êS©N¥:”êS©N¥:”êS©›u)Ô§RJu3n¥:”êS©N¥:”êS©N¥:”êS©›u)Ô§RJu3n¥:”êS©N¥:”êS©›u)Ô§RJu)Ôͺ”êS©N¥:™·S6êS©N¥:”êS©N¥:™·S6êS©N¥:™·RJu)Ô§S6êS©N¥:”êfÝJu)Ô§S6êS©›u)Ô§S6êS©N¥'†Ô™·ˆÛ©N¥:™·RJu)Ôͺ”êS©N¥:”êS©N¥:”êS©N¥:”êS©N¦º™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¥:™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¦mÔͺ™·S6êfÝLÛ©›u3n¦mÔͺ™·RJu4mÔ+©¶»©¶»©¶»©µÍÔ§S6êS©›u)Ôͺ”êS©N¥:™·S6êfÝJu)Ô§RJu)Ô§Rœ]áâ»—v.ñÇ«¯àæ=Víïï銞ßdgìö{= XxœoÜþÁÕSÀ\SÚ‡wÝüùôiÇp²pþΞ¡Ž‘Ö=•¨öh4Û×ÕëõúýžÊªªªªA’I$I$•"’I%)$’Hš¤’I$’ $•"’I$’I%˳–èèßÜÜņ: q#m£ÄwùüÃÒþ‘ï§×é#ð‡/Z«îÏ—m»ëm"cTwã¦û-¿‡²þѬÁ²¾£GÚZ`ãÛ­pÑ•Ã@`&­JýÝÑ>ï~I31Ý#€éÝý=;6Ù<ÓíÐÝÝÝßßSñÑtÙQTUEQzê뮺ºë®®½Ýë®@ $ïÎBfˆ}ã§:çwsœç2ä&bŒñª÷WÍ´‰·KÛ»á#÷¼ðþ™?¡ýùÕRAŠ úÑJåþ“ý/ññn¨§ö?ÜðÐÏû¯úZl`ÆÍ4Æ›?ëvt¿±¹º«—üŒÜèÑѱÿ˜ª¥pîW%txº¦ÎÏúÞ¯w«»É™ÑäÓÏ(aH°‰ Ô‰ ÿ¯õ?£7åûŸ³ù?Æ’$ûçÏWüаü?\ÿ/êí¢—ûÅÐýÛí/µ?õuÌÌ¿XD½ù:7\vZñÀÈEl{oo£ºxî©­ÓªOo×Ñ»mûµÛúÃÜÈ ý³çÌ Y™€Ý³†^V>ÌdzZù½þ|üÒ?qðõB$~ˆwÒ-BÐMöüðç»éw ›÷9ËmµÕ…Ý2}Ú^s’Úq'!œæÛîSxéùC ¦fî#ãÓåå?~Ù↿¡qÆ5 Û²$Ô £Òîú[Â@gff ÛÛáááà À³˜€ DÙ¸ëÆ÷{½Üsœçç9ÀsœV®º×Æä¾›á×ÚûG9Ï—®ºÔÓÌŠÈg§¥¹'bºáYº8² £`3Ó_$ݺi{ÝÎmÙžñ¼D““Ü~7&iºyëú«¶ÛyÅ^™g9fUMÑ×]³·n¸ëž‰Ö&ÈÚ ÍJ6IºNš‰ÒË\tQÊ:QÓý+.Ùð÷|>`[Ë·å¶x·|=ìX‚@, "ÝŒºúúåNíÕW½ßŠJØ$œ$¯{¾M;“ùá€ø…¬ ­ºÚwÛºw›ñj×8·„éÖßq$‰/ÛºùôâÝ·r‹^ÒAû^ŸŒE›$’r¥•î,^/zpæ}zvPÌÌ3®õÓ{þ±Ó·xõv[tÖÜ~:¥«øÏ<œ(tXˆ›?ð¼h‘ôv|œªqž}u%M½=ý9ù¹‡k|¼Ù·¬„½­µf^zv¶ßx}©»—±Ëè~i{l’IŽÜLеÛ=OYVüÕ¯¯Ü$¥?+œç9räH‘ éÓºx²O’R€%(I$—fh %™¼ntÍ÷ïW±NøÑ3d@a[oví¾ûã-·7ß}÷ß&*ª±»víÛ·baJR˜nnnnnndMÝÙÅg9».îíâ°›»±ç9ÎKeÝݼVwv<ç9Él»»·ŠÎr]ÝÛÅg9;nýu×=}D” e·ªª*õª¦â­ø­úBI=õ¹À>ãCµjóìö|~?~|9Ëã×^j£“|U^÷tk©$’I$6yfåñD“Yçݾûç…ª«o þ§Õë•'ÁØŸ™'Õÿ'îu1:X[%ªÆ3®§éi$C–’VÛ¼¢$¢"&•,¬”IIID”µ+QQ6dÄÃÌÆÍ)’˜X,E„Z¦TÌf5´­¤¤¥²‰)+ê›s/…3fVêÉuŽšÓþó­o®7’C¤JE, ›¿—mŽ•·<Æèlå)UœâeÝd›n³m2ùÓY¥…¦ŠD”Ë (C0N¦–Ð;2î³¥®›Òép`Ã+W Ò¶ÐÚe2SN”¦C&vn‡M3%F©ú©;(þäüÿ‘v ÝÝ×®®Ö=ÅÏ|Gwwr°ù¼@Èpfr 4 1 ~RŸXSžý®ÜÙÍ\Ëc™Ìªq–UWçî?cõ“'m*Hdnÿ/Û÷õ­k¿ˆöÞôîîíõï_¯Þó÷½é8ÚK¶’Øö}•sœàH9Î-<üû¦ïàÙ|V%7¥‡…¼ia³¦XJ¨JR'õñÞÛ~ogwvûï{ûûÛ÷|=ßgOºSÁ;âØÌ—%4#èáË”¶Çgþ´Æo÷G$w aÛ §§§$I:ëU{Üè’ÅÉ' +ÞåeûÃ|£!¹Èû°” «kM¼­»“É8qj¸qż‡èùÏà}>”Œéåõ×ìp†’¡u çîCð¦ªçŽ÷ë9Õ;äïÿ¤d7ÊæxVÁøäé5Ö΋ æH²q¥rÚJí67–„²Ã·:Gד¢Y.ÞÜÑ]5Ù;>Ô:M£ÇZÞ+¨jv”q2sÒš77–„²Ã,âO2W3Ï §DØ«­xyχ…ÚÆ®þYÒz.Å]kŮښI2;²oÖd¼-É7ðh¬aѱ%Ö¼-vÕÕåt諯>Ä^mÊIÌ?±÷?Ôë¼…‚G@@õ}VÛ³½#ñ"b½“Çm/ƒZ4}Š_¨ðý§m,²Y-¶Ûm¶Ûo€DD‰x“§x–téeî–É=ÿtû )@’”$’I6³0³gXòÆíË•Œ²ar²hv­·Ž;vß}î[mÍ÷ß}÷¸ªª¬nÝ»víÕ…)JS ÍÍÍÍá7wvq]ç7k»»x®ÍÝÝ9Îsm®îíâ»7wv<ç9Ͷ]ÝÛÅg9]ÝÞÝúë§~ýºÝú맯¨’”’KGP,ÊÔ)H´”Ÿ¨Î®*µ×LØè\ë5X±$ßW½ÊÈÐ7æz9yD’´ÓKÞ說µ€êfÁaØ;ˆqÞßÝ+Odçðí÷IéééÇœ¶úgÿ—xoõ[ RÔ¶~J·ËíKµÄÜbÛi»t£bµ²ù{IyCãþ‹~Þ<{;ÒHÔÿŸ€Ñééìö{sæ%ÌyqU{yg^«¾í÷Æ1“ ;_bøg=6Ó¯^½põ‰Æ[ RÔ¶Ya)À ìÖlô:3Ì0þÊË¿«sG­§æ÷ßm8ãZ^3Ž6ÓŽ¿Cëþosž_ ±q …}Éó§ UWÛ9pHÚÄÊõ0«2#äÛ5g{ #£œÕ«>œ:¼ÛDiÿLõÙcU¬Uˆír»1‰»ØWÈïwãUbÄx\®q„\6}Ï©³]Õ_3Q[¦Írk2©ü*ö}ÉßòÛoÞxû'´ž¶”„ÔÑõk¯a—ZÓ²?-ß>_K“ßãÃÀ á¼÷StÛ-©¦ŠÙ›6h¥ØÃcccBÕÚM-ÝSlšn›%µM²iºl–ÔU7l…ªm“KTÛ&Î÷fÉß9Þnï‰ÆÎr§]vfaŸf†a™“œ7|xñi➶ÕÌ'ïŸ{cÂ}ï¯â{ûwËWÃÜí#âÚ‘lûO¼VµÆ\HË<= y’{uI#Ÿ·ÃÃØzzz"æ%ÌK˜èwóÊó¤ëè½Ù¾±Ïyš›Ò-*‰„%ν»²:÷[Ý}U]8Ö8v#¤ e7kZ Ùík@)¾@Þ‘ñöïǽkœ}³"åÃhŒKµy°®H§T}¨îMéO×ÈöïW­Ðý©H뿶Q}¿o£Õ6ÞñóSÏ…~ƒ34û û3‚yÕéû„Èë;Ðï¨ÖósÏÿKJð–#%¥m:M6œ!¹lü{Îé§iŒâôÏÎ^U¨Ù«oÚØö¾§cEðeîÍjìž4 šÊÃtÖ,4ÐÑ ‰C@ÐB@7MdÑ$5“MÓdTâËe6A.,ĸ³ãM(Rné¶YX~‡Sy8Çמ~¿Ìø|zº;fVsNûÐÞ¾k&[l¤åß‹Gx ci`.<¹ë¨0$$I/Q !÷gˆqqa ,HaÖ) 'RËá³ÓÊ›æ,7MbóÜï繺yæL0rÒ½ì?¬|TqÄâ#yiY)WRÒ¾Ù´Â:ö¹¼´¯-æDjZWGMø-ÞfaK’Ò·vš#§78–•¦Ó"5-+Ý©„m“Áäç¬Ñ½OZ80<]9!½ì6E†é¬Xi¡¢A¢š0Ñ£«¬ÊÓ1u™VÊl‚\Yl¦È%Ř—b\Y¬LYl¦Él¹²{ åãÛøo9ÃœÊæØjýlŒG´›C¹é®ÝŠ¥Ý­mK³F`ËÚ>c ‹0. и¿½G ²ÑŽ§§…7ÄXnšÅ‡´ß—×7CH70¹¸ÎZN[êêäV|ß+µø£µsÓ¢«¥v}íiíqÆŽG|òðE{6-i ÷ºrCz±5•†é¬Xi¡¢A QMhÑ‚ÕÖei˜ºÌ«TÙ¸²ÙMK‹1.,Á¬š\°K&›¦È°Ý5‹ ñ÷>÷>oœñÏE¶õ¼'´{gá½õ•tnN!óvïï*‡Œ Ð^!ÆBàAÄŒD¸ÃmùsawÊb¨°Ý5‹3ÝÀW™òŸz[§ÎrôóÓ­æÍ7­†È°Ý5‹ 44H"B”SF4`µu™Zf.³*ÙMK‹-”Ù¸³âÌK‹1-·U”Ù-—6ON_±’}¼ø:óNÏkçlâÖxÓ—Gªgº×+.^÷~Ûve–î‚IØõ†â›|ã/ µCÕX÷±ÂpŸ?“Ýz÷¯†okÌôÀö³3ݦJ±Ù¦Ò÷ÞsÇÏß];ç©ÜMî[]Ól¶½OcÞ@>éŸw>kÌú]Ðz'6ÁÎÄ“à¸v class='del'>-}
-
-
-/*
- * fsm_open - Link is allowed to come up.
- */
-void
-fsm_open(f)
- fsm *f;
-{
- switch( f->state ){
- case INITIAL:
- f->state = STARTING;
- if( f->callbacks->starting )
- (*f->callbacks->starting)(f);
- break;
-
- case CLOSED:
- if( f->flags & OPT_SILENT )
- f->state = STOPPED;
- else {
- /* Send an initial configure-request */
- fsm_sconfreq(f, 0);
- f->state = REQSENT;
- }
- break;
-
- case CLOSING:
- f->state = STOPPING;
- /* fall through */
- case STOPPED:
- case OPENED:
- if( f->flags & OPT_RESTART ){
- fsm_lowerdown(f);
- fsm_lowerup(f);
- }
- break;
- }
-}
-
-
-/*
- * fsm_close - Start closing connection.
- *
- * Cancel timeouts and either initiate close or possibly go directly to
- * the CLOSED state.
- */
-void
-fsm_close(f, reason)
- fsm *f;
- char *reason;
-{
- f->term_reason = reason;
- f->term_reason_len = (reason == NULL? 0: strlen(reason));
- switch( f->state ){
- case STARTING:
- f->state = INITIAL;
- break;
- case STOPPED:
- f->state = CLOSED;
- break;
- case STOPPING:
- f->state = CLOSING;
- break;
-
- case REQSENT:
- case ACKRCVD:
- case ACKSENT:
- case OPENED:
- if( f->state != OPENED )
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- else if( f->callbacks->down )
- (*f->callbacks->down)(f); /* Inform upper layers we're down */
-
- /* Init restart counter, send Terminate-Request */
- f->retransmits = f->maxtermtransmits;
- fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
- (u_char *) f->term_reason, f->term_reason_len);
- TIMEOUT(fsm_timeout, f, f->timeouttime);
- --f->retransmits;
-
- f->state = CLOSING;
- break;
- }
-}
-
-
-/*
- * fsm_timeout - Timeout expired.
- */
-static void
-fsm_timeout(arg)
- void *arg;
-{
- fsm *f = (fsm *) arg;
-
- switch (f->state) {
- case CLOSING:
- case STOPPING:
- if( f->retransmits <= 0 ){
- /*
- * We've waited for an ack long enough. Peer probably heard us.
- */
- f->state = (f->state == CLOSING)? CLOSED: STOPPED;
- if( f->callbacks->finished )
- (*f->callbacks->finished)(f);
- } else {
- /* Send Terminate-Request */
- fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
- (u_char *) f->term_reason, f->term_reason_len);
- TIMEOUT(fsm_timeout, f, f->timeouttime);
- --f->retransmits;
- }
- break;
-
- case REQSENT:
- case ACKRCVD:
- case ACKSENT:
- if (f->retransmits <= 0) {
- warn("%s: timeout sending Config-Requests\n", PROTO_NAME(f));
- f->state = STOPPED;
- if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished )
- (*f->callbacks->finished)(f);
-
- } else {
- /* Retransmit the configure-request */
- if (f->callbacks->retransmit)
- (*f->callbacks->retransmit)(f);
- fsm_sconfreq(f, 1); /* Re-send Configure-Request */
- if( f->state == ACKRCVD )
- f->state = REQSENT;
- }
- break;
-
- default:
- FSMDEBUG(("%s: Timeout event in state %d!", PROTO_NAME(f), f->state));
- }
-}
-
-
-/*
- * fsm_input - Input packet.
- */
-void
-fsm_input(f, inpacket, l)
- fsm *f;
- u_char *inpacket;
- int l;
-{
- u_char *inp;
- u_char code, id;
- int len;
-
- /*
- * Parse header (code, id and length).
- * If packet too short, drop it.
- */
- inp = inpacket;
- if (l < HEADERLEN) {
- FSMDEBUG(("fsm_input(%x): Rcvd short header.", f->protocol));
- return;
- }
- GETCHAR(code, inp);
- GETCHAR(id, inp);
- GETSHORT(len, inp);
- if (len < HEADERLEN) {
- FSMDEBUG(("fsm_input(%x): Rcvd illegal length.", f->protocol));
- return;
- }
- if (len > l) {
- FSMDEBUG(("fsm_input(%x): Rcvd short packet.", f->protocol));
- return;
- }
- len -= HEADERLEN; /* subtract header length */
-
- if( f->state == INITIAL || f->state == STARTING ){
- FSMDEBUG(("fsm_input(%x): Rcvd packet in state %d.",
- f->protocol, f->state));
- return;
- }
-
- /*
- * Action depends on code.
- */
- switch (code) {
- case CONFREQ:
- fsm_rconfreq(f, id, inp, len);
- break;
-
- case CONFACK:
- fsm_rconfack(f, id, inp, len);
- break;
-
- case CONFNAK:
- case CONFREJ:
- fsm_rconfnakrej(f, code, id, inp, len);
- break;
-
- case TERMREQ:
- fsm_rtermreq(f, id, inp, len);
- break;
-
- case TERMACK:
- fsm_rtermack(f);
- break;
-
- case CODEREJ:
- fsm_rcoderej(f, inp, len);
- break;
-
- default:
- if( !f->callbacks->extcode
- || !(*f->callbacks->extcode)(f, code, id, inp, len) )
- fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN);
- break;
- }
-}
-
-
-/*
- * fsm_rconfreq - Receive Configure-Request.
- */
-static void
-fsm_rconfreq(f, id, inp, len)
- fsm *f;
- u_char id;
- u_char *inp;
- int len;
-{
- int code, reject_if_disagree;
-
- switch( f->state ){
- case CLOSED:
- /* Go away, we're closed */
- fsm_sdata(f, TERMACK, id, NULL, 0);
- return;
- case CLOSING:
- case STOPPING:
- return;
-
- case OPENED:
- /* Go down and restart negotiation */
- if( f->callbacks->down )
- (*f->callbacks->down)(f); /* Inform upper layers */
- fsm_sconfreq(f, 0); /* Send initial Configure-Request */
- break;
-
- case STOPPED:
- /* Negotiation started by our peer */
- fsm_sconfreq(f, 0); /* Send initial Configure-Request */
- f->state = REQSENT;
- break;
- }
-
- /*
- * Pass the requested configuration options
- * to protocol-specific code for checking.
- */
- if (f->callbacks->reqci){ /* Check CI */
- reject_if_disagree = (f->nakloops >= f->maxnakloops);
- code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree);
- } else if (len)
- code = CONFREJ; /* Reject all CI */
- else
- code = CONFACK;
-
- /* send the Ack, Nak or Rej to the peer */
- fsm_sdata(f, code, id, inp, len);
-
- if (code == CONFACK) {
- if (f->state == ACKRCVD) {
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- f->state = OPENED;
- if (f->callbacks->up)
- (*f->callbacks->up)(f); /* Inform upper layers */
- } else {
- f->state = ACKSENT;
- ppp_delay();
- }
- f->nakloops = 0;
-
- } else {
- /* we sent CONFACK or CONFREJ */
- if (f->state != ACKRCVD)
- f->state = REQSENT;
- if( code == CONFNAK )
- ++f->nakloops;
- }
-}
-
-
-/*
- * fsm_rconfack - Receive Configure-Ack.
- */
-static void
-fsm_rconfack(f, id, inp, len)
- fsm *f;
- int id;
- u_char *inp;
- int len;
-{
- if (id != f->reqid || f->seen_ack) /* Expected id? */
- return; /* Nope, toss... */
- if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len):
- (len == 0)) ){
- /* Ack is bad - ignore it */
- error("Received bad configure-ack: %P", inp, len);
- return;
- }
- f->seen_ack = 1;
-
- switch (f->state) {
- case CLOSED:
- case STOPPED:
- fsm_sdata(f, TERMACK, id, NULL, 0);
- break;
-
- case REQSENT:
- f->state = ACKRCVD;
- f->retransmits = f->maxconfreqtransmits;
- break;
-
- case ACKRCVD:
- /* Huh? an extra valid Ack? oh well... */
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- fsm_sconfreq(f, 0);
- f->state = REQSENT;
- break;
-
- case ACKSENT:
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- f->state = OPENED;
- f->retransmits = f->maxconfreqtransmits;
- if (f->callbacks->up)
- (*f->callbacks->up)(f); /* Inform upper layers */
- break;
-
- case OPENED:
- /* Go down and restart negotiation */
- if (f->callbacks->down)
- (*f->callbacks->down)(f); /* Inform upper layers */
- fsm_sconfreq(f, 0); /* Send initial Configure-Request */
- f->state = REQSENT;
- break;
- }
-}
-
-
-/*
- * fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.
- */
-static void
-fsm_rconfnakrej(f, code, id, inp, len)
- fsm *f;
- int code, id;
- u_char *inp;
- int len;
-{
- int (*proc) __P((fsm *, u_char *, int));
- int ret;
-
- if (id != f->reqid || f->seen_ack) /* Expected id? */
- return; /* Nope, toss... */
- proc = (code == CONFNAK)? f->callbacks->nakci: f->callbacks->rejci;
- if (!proc || !(ret = proc(f, inp, len))) {
- /* Nak/reject is bad - ignore it */
- error("Received bad configure-nak/rej: %P", inp, len);
- return;
- }
- f->seen_ack = 1;
-
- switch (f->state) {
- case CLOSED:
- case STOPPED:
- fsm_sdata(f, TERMACK, id, NULL, 0);
- break;
-
- case REQSENT:
- case ACKSENT:
- /* They didn't agree to what we wanted - try another request */
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- if (ret < 0)
- f->state = STOPPED; /* kludge for stopping CCP */
- else
- fsm_sconfreq(f, 0); /* Send Configure-Request */
- break;
-
- case ACKRCVD:
- /* Got a Nak/reject when we had already had an Ack?? oh well... */
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- fsm_sconfreq(f, 0);
- f->state = REQSENT;
- break;
-
- case OPENED:
- /* Go down and restart negotiation */
- if (f->callbacks->down)
- (*f->callbacks->down)(f); /* Inform upper layers */
- fsm_sconfreq(f, 0); /* Send initial Configure-Request */
- f->state = REQSENT;
- break;
- }
-}
-
-
-/*
- * fsm_rtermreq - Receive Terminate-Req.
- */
-static void
-fsm_rtermreq(f, id, p, len)
- fsm *f;
- int id;
- u_char *p;
- int len;
-{
- switch (f->state) {
- case ACKRCVD:
- case ACKSENT:
- f->state = REQSENT; /* Start over but keep trying */
- break;
-
- case OPENED:
- if (len > 0) {
- info("%s terminated by peer (%0.*v)", PROTO_NAME(f), len, p);
- } else
- info("%s terminated by peer", PROTO_NAME(f));
- if (f->callbacks->down)
- (*f->callbacks->down)(f); /* Inform upper layers */
- f->retransmits = 0;
- f->state = STOPPING;
- TIMEOUT(fsm_timeout, f, f->timeouttime);
- break;
- }
-
- fsm_sdata(f, TERMACK, id, NULL, 0);
-}
-
-
-/*
- * fsm_rtermack - Receive Terminate-Ack.
- */
-static void
-fsm_rtermack(f)
- fsm *f;
-{
- switch (f->state) {
- case CLOSING:
- UNTIMEOUT(fsm_timeout, f);
- f->state = CLOSED;
- if( f->callbacks->finished )
- (*f->callbacks->finished)(f);
- break;
- case STOPPING:
- UNTIMEOUT(fsm_timeout, f);
- f->state = STOPPED;
- if( f->callbacks->finished )
- (*f->callbacks->finished)(f);
- break;
-
- case ACKRCVD:
- f->state = REQSENT;
- break;
-
- case OPENED:
- if (f->callbacks->down)
- (*f->callbacks->down)(f); /* Inform upper layers */
- fsm_sconfreq(f, 0);
- break;
- }
-}
-
-
-/*
- * fsm_rcoderej - Receive an Code-Reject.
- */
-static void
-fsm_rcoderej(f, inp, len)
- fsm *f;
- u_char *inp;
- int len;
-{
- u_char code, id;
-
- if (len < HEADERLEN) {
- FSMDEBUG(("fsm_rcoderej: Rcvd short Code-Reject packet!"));
- return;
- }
- GETCHAR(code, inp);
- GETCHAR(id, inp);
- warn("%s: Rcvd Code-Reject for code %d, id %d", PROTO_NAME(f), code, id);
-
- if( f->state == ACKRCVD )
- f->state = REQSENT;
-}
-
-
-/*
- * fsm_protreject - Peer doesn't speak this protocol.
- *
- * Treat this as a catastrophic error (RXJ-).
- */
-void
-fsm_protreject(f)
- fsm *f;
-{
- switch( f->state ){
- case CLOSING:
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- /* fall through */
- case CLOSED:
- f->state = CLOSED;
- if( f->callbacks->finished )
- (*f->callbacks->finished)(f);
- break;
-
- case STOPPING:
- case REQSENT:
- case ACKRCVD:
- case ACKSENT:
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- /* fall through */
- case STOPPED:
- f->state = STOPPED;
- if( f->callbacks->finished )
- (*f->callbacks->finished)(f);
- break;
-
- case OPENED:
- if( f->callbacks->down )
- (*f->callbacks->down)(f);
-
- /* Init restart counter, send Terminate-Request */
- f->retransmits = f->maxtermtransmits;
- fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
- (u_char *) f->term_reason, f->term_reason_len);
- TIMEOUT(fsm_timeout, f, f->timeouttime);
- --f->retransmits;
-
- f->state = STOPPING;
- break;
-
- default:
- FSMDEBUG(("%s: Protocol-reject event in state %d!",
- PROTO_NAME(f), f->state));
- }
-}
-
-
-/*
- * fsm_sconfreq - Send a Configure-Request.
- */
-static void
-fsm_sconfreq(f, retransmit)
- fsm *f;
- int retransmit;
-{
- u_char *outp;
- int cilen;
-
- if( f->state != REQSENT && f->state != ACKRCVD && f->state != ACKSENT ){
- /* Not currently negotiating - reset options */
- if( f->callbacks->resetci )
- (*f->callbacks->resetci)(f);
- f->nakloops = 0;
- }
-
- if( !retransmit ){
- /* New request - reset retransmission counter, use new ID */
- f->retransmits = f->maxconfreqtransmits;
- f->reqid = ++f->id;
- }
-
- f->seen_ack = 0;
-
- /*
- * Make up the request packet
- */
- outp = outpacket_buf + PPP_HDRLEN + HEADERLEN;
- if( f->callbacks->cilen && f->callbacks->addci ){
- cilen = (*f->callbacks->cilen)(f);
- if( cilen > peer_mru[f->unit] - HEADERLEN )
- cilen = peer_mru[f->unit] - HEADERLEN;
- if (f->callbacks->addci)
- (*f->callbacks->addci)(f, outp, &cilen);
- } else
- cilen = 0;
-
- /* send the request to our peer */
- fsm_sdata(f, CONFREQ, f->reqid, outp, cilen);
-
- /* start the retransmit timer */
- --f->retransmits;
- TIMEOUT(fsm_timeout, f, f->timeouttime);
-}
-
-
-/*
- * fsm_sdata - Send some data.
- *
- * Used for all packets sent to our peer by this module.
- */
-void
-fsm_sdata(f, code, id, data, datalen)
- fsm *f;
- u_char code, id;
- u_char *data;
- int datalen;
-{
- u_char *outp;
- int outlen;
-
- /* Adjust length to be smaller than MTU */
- outp = outpacket_buf;
- if (datalen > peer_mru[f->unit] - HEADERLEN)
- datalen = peer_mru[f->unit] - HEADERLEN;
- if (datalen && data != outp + PPP_HDRLEN + HEADERLEN)
- BCOPY(data, outp + PPP_HDRLEN + HEADERLEN, datalen);
- outlen = datalen + HEADERLEN;
- MAKEHEADER(outp, f->protocol);
- PUTCHAR(code, outp);
- PUTCHAR(id, outp);
- PUTSHORT(outlen, outp);
- output(f->unit, outpacket_buf, outlen + PPP_HDRLEN);
-}
diff --git a/c/src/libnetworking/pppd/fsm.h b/c/src/libnetworking/pppd/fsm.h
deleted file mode 100644
index d1e623467c..0000000000
--- a/c/src/libnetworking/pppd/fsm.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * fsm.h - {Link, IP} Control Protocol Finite State Machine definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id$
- */
-
-/*
- * Packet header = Code, id, length.
- */
-#define HEADERLEN 4
-
-
-/*
- * CP (LCP, IPCP, etc.) codes.
- */
-#define CONFREQ 1 /* Configuration Request */
-#define CONFACK 2 /* Configuration Ack */
-#define CONFNAK 3 /* Configuration Nak */
-#define CONFREJ 4 /* Configuration Reject */
-#define TERMREQ 5 /* Termination Request */
-#define TERMACK 6 /* Termination Ack */
-#define CODEREJ 7 /* Code Reject */
-
-
-/*
- * Each FSM is described by an fsm structure and fsm callbacks.
- */
-typedef struct fsm {
- int unit; /* Interface unit number */
- int protocol; /* Data Link Layer Protocol field value */
- int state; /* State */
- int flags; /* Contains option bits */
- u_char id; /* Current id */
- u_char reqid; /* Current request id */
- u_char seen_ack; /* Have received valid Ack/Nak/Rej to Req */
- int timeouttime; /* Timeout time in milliseconds */
- int maxconfreqtransmits; /* Maximum Configure-Request transmissions */
- int retransmits; /* Number of retransmissions left */
- int maxtermtransmits; /* Maximum Terminate-Request transmissions */
- int nakloops; /* Number of nak loops since last ack */
- int maxnakloops; /* Maximum number of nak loops tolerated */
- struct fsm_callbacks *callbacks; /* Callback routines */
- char *term_reason; /* Reason for closing protocol */
- int term_reason_len; /* Length of term_reason */
-} fsm;
-
-
-typedef struct fsm_callbacks {
- void (*resetci) /* Reset our Configuration Information */
- __P((fsm *));
- int (*cilen) /* Length of our Configuration Information */
- __P((fsm *));
- void (*addci) /* Add our Configuration Information */
- __P((fsm *, u_char *, int *));
- int (*ackci) /* ACK our Configuration Information */
- __P((fsm *, u_char *, int));
- int (*nakci) /* NAK our Configuration Information */
- __P((fsm *, u_char *, int));
- int (*rejci) /* Reject our Configuration Information */
- __P((fsm *, u_char *, int));
- int (*reqci) /* Request peer's Configuration Information */
- __P((fsm *, u_char *, int *, int));
- void (*up) /* Called when fsm reaches OPENED state */
- __P((fsm *));
- void (*down) /* Called when fsm leaves OPENED state */
- __P((fsm *));
- void (*starting) /* Called when we want the lower layer */
- __P((fsm *));
- void (*finished) /* Called when we don't want the lower layer */
- __P((fsm *));
- void (*protreject) /* Called when Protocol-Reject received */
- __P((int));
- void (*retransmit) /* Retransmission is necessary */
- __P((fsm *));
- int (*extcode) /* Called when unknown code received */
- __P((fsm *, int, int, u_char *, int));
- char *proto_name; /* String name for protocol (for messages) */
-} fsm_callbacks;
-
-
-/*
- * Link states.
- */
-#define INITIAL 0 /* Down, hasn't been opened */
-#define STARTING 1 /* Down, been opened */
-#define CLOSED 2 /* Up, hasn't been opened */
-#define STOPPED 3 /* Open, waiting for down event */
-#define CLOSING 4 /* Terminating the connection, not open */
-#define STOPPING 5 /* Terminating, but open */
-#define REQSENT 6 /* We've sent a Config Request */
-#define ACKRCVD 7 /* We've received a Config Ack */
-#define ACKSENT 8 /* We've sent a Config Ack */
-#define OPENED 9 /* Connection available */
-
-
-/*
- * Flags - indicate options controlling FSM operation
- */
-#define OPT_PASSIVE 1 /* Don't die if we don't get a response */
-#define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */
-#define OPT_SILENT 4 /* Wait for peer to speak first */
-
-
-/*
- * Timeouts.
- */
-#define DEFTIMEOUT 5 /* Timeout time in seconds */
-#define DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */
-#define DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */
-#define DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */
-
-
-/*
- * Prototypes
- */
-void fsm_init __P((fsm *));
-void fsm_lowerup __P((fsm *));
-void fsm_lowerdown __P((fsm *));
-void fsm_open __P((fsm *));
-void fsm_close __P((fsm *, char *));
-void fsm_input __P((fsm *, u_char *, int));
-void fsm_protreject __P((fsm *));
-void fsm_sdata __P((fsm *, u_char, u_char, u_char *, int));
-
-
-/*
- * Variables
- */
-extern int peer_mru[]; /* currently negotiated peer MRU (per unit) */
diff --git a/c/src/libnetworking/pppd/ipcp.c b/c/src/libnetworking/pppd/ipcp.c
deleted file mode 100644
index 6b6a93a09e..0000000000
--- a/c/src/libnetworking/pppd/ipcp.c
+++ /dev/null
@@ -1,1768 +0,0 @@
-/*
- * ipcp.c - PPP IP Control Protocol.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#define RCSID "$Id$"
-
-/*
- * TODO:
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <netdb.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <resolv.h>
-
-#include "pppd.h"
-#include "fsm.h"
-#include "ipcp.h"
-#include "pathnames.h"
-
-#include <rtems/bsdnet/servers.h>
-
-static const char rcsid[] = RCSID;
-
-/* global vars */
-ipcp_options ipcp_wantoptions[NUM_PPP]; /* Options that we want to request */
-ipcp_options ipcp_gotoptions[NUM_PPP]; /* Options that peer ack'd */
-ipcp_options ipcp_allowoptions[NUM_PPP]; /* Options we allow peer to request */
-ipcp_options ipcp_hisoptions[NUM_PPP]; /* Options that we ack'd */
-
-bool disable_defaultip = 0; /* Don't use hostname for default IP adrs */
-
-/* Hook for a plugin to know when IP protocol has come up */
-void (*ip_up_hook) __P((void)) = NULL;
-
-/* Hook for a plugin to know when IP protocol has come down */
-void (*ip_down_hook) __P((void)) = NULL;
-
-/* local vars */
-static int default_route_set[NUM_PPP]; /* Have set up a default route */
-static int proxy_arp_set[NUM_PPP]; /* Have created proxy arp entry */
-static bool usepeerdns; /* Ask peer for DNS addrs */
-static int ipcp_is_up; /* have called np_up() */
-
-/*
- * Callbacks for fsm code. (CI = Configuration Information)
- */
-static void ipcp_resetci __P((fsm *)); /* Reset our CI */
-static int ipcp_cilen __P((fsm *)); /* Return length of our CI */
-static void ipcp_addci __P((fsm *, u_char *, int *)); /* Add our CI */
-static int ipcp_ackci __P((fsm *, u_char *, int)); /* Peer ack'd our CI */
-static int ipcp_nakci __P((fsm *, u_char *, int)); /* Peer nak'd our CI */
-static int ipcp_rejci __P((fsm *, u_char *, int)); /* Peer rej'd our CI */
-static int ipcp_reqci __P((fsm *, u_char *, int *, int)); /* Rcv CI */
-static void ipcp_up __P((fsm *)); /* We're UP */
-static void ipcp_down __P((fsm *)); /* We're DOWN */
-static void ipcp_finished __P((fsm *)); /* Don't need lower layer */
-
-fsm ipcp_fsm[NUM_PPP]; /* IPCP fsm structure */
-
-static fsm_callbacks ipcp_callbacks = { /* IPCP callback routines */
- ipcp_resetci, /* Reset our Configuration Information */
- ipcp_cilen, /* Length of our Configuration Information */
- ipcp_addci, /* Add our Configuration Information */
- ipcp_ackci, /* ACK our Configuration Information */
- ipcp_nakci, /* NAK our Configuration Information */
- ipcp_rejci, /* Reject our Configuration Information */
- ipcp_reqci, /* Request peer's Configuration Information */
- ipcp_up, /* Called when fsm reaches OPENED state */
- ipcp_down, /* Called when fsm leaves OPENED state */
- NULL, /* Called when we want the lower layer up */
- ipcp_finished, /* Called when we want the lower layer down */
- NULL, /* Called when Protocol-Reject received */
- NULL, /* Retransmission is necessary */
- NULL, /* Called to handle protocol-specific codes */
- "IPCP" /* String name of protocol */
-};
-
-/*
- * Command-line options.
- */
-static int setvjslots __P((char **));
-static int setdnsaddr __P((char **));
-static int setwinsaddr __P((char **));
-
-static option_t ipcp_option_list[] = {
- { "noip", o_bool, &ipcp_protent.enabled_flag,
- "Disable IP and IPCP" },
- { "-ip", o_bool, &ipcp_protent.enabled_flag,
- "Disable IP and IPCP" },
- { "novj", o_bool, &ipcp_wantoptions[0].neg_vj,
- "Disable VJ compression", OPT_A2COPY, &ipcp_allowoptions[0].neg_vj },
- { "-vj", o_bool, &ipcp_wantoptions[0].neg_vj,
- "Disable VJ compression", OPT_A2COPY, &ipcp_allowoptions[0].neg_vj },
- { "novjccomp", o_bool, &ipcp_wantoptions[0].cflag,
- "Disable VJ connection-ID compression", OPT_A2COPY,
- &ipcp_allowoptions[0].cflag },
- { "-vjccomp", o_bool, &ipcp_wantoptions[0].cflag,
- "Disable VJ connection-ID compression", OPT_A2COPY,
- &ipcp_allowoptions[0].cflag },
- { "vj-max-slots", 1, setvjslots,
- "Set maximum VJ header slots" },
- { "ipcp-accept-local", o_bool, &ipcp_wantoptions[0].accept_local,
- "Accept peer's address for us", 1 },
- { "ipcp-accept-remote", o_bool, &ipcp_wantoptions[0].accept_remote,
- "Accept peer's address for it", 1 },
- { "ipparam", o_string, &ipparam,
- "Set ip script parameter" },
- { "noipdefault", o_bool, &disable_defaultip,
- "Don't use name for default IP adrs", 1 },
- { "ms-dns", 1, setdnsaddr,
- "DNS address for the peer's use" },
- { "ms-wins", 1, setwinsaddr,
- "Nameserver for SMB over TCP/IP for peer" },
- { "ipcp-restart", o_int, &ipcp_fsm[0].timeouttime,
- "Set timeout for IPCP" },
- { "ipcp-max-terminate", o_int, &ipcp_fsm[0].maxtermtransmits,
- "Set max #xmits for term-reqs" },
- { "ipcp-max-configure", o_int, &ipcp_fsm[0].maxconfreqtransmits,
- "Set max #xmits for conf-reqs" },
- { "ipcp-max-failure", o_int, &ipcp_fsm[0].maxnakloops,
- "Set max #conf-naks for IPCP" },
- { "defaultroute", o_bool, &ipcp_wantoptions[0].default_route,
- "Add default route", OPT_ENABLE|1, &ipcp_allowoptions[0].default_route },
- { "nodefaultroute", o_bool, &ipcp_allowoptions[0].default_route,
- "disable defaultroute option", OPT_A2COPY,
- &ipcp_wantoptions[0].default_route },
- { "-defaultroute", o_bool, &ipcp_allowoptions[0].default_route,
- "disable defaultroute option", OPT_A2COPY,
- &ipcp_wantoptions[0].default_route },
- { "proxyarp", o_bool, &ipcp_wantoptions[0].proxy_arp,
- "Add proxy ARP entry", OPT_ENABLE|1, &ipcp_allowoptions[0].proxy_arp },
- { "noproxyarp", o_bool, &ipcp_allowoptions[0].proxy_arp,
- "disable proxyarp option", OPT_A2COPY,
- &ipcp_wantoptions[0].proxy_arp },
- { "-proxyarp", o_bool, &ipcp_allowoptions[0].proxy_arp,
- "disable proxyarp option", OPT_A2COPY,
- &ipcp_wantoptions[0].proxy_arp },
- { "usepeerdns", o_bool, &usepeerdns,
- "Ask peer for DNS address(es)", 1 },
- { NULL }
-};
-
-/*
- * Protocol entry points from main code.
- */
-static void ipcp_init __P((int));
-static void ipcp_open __P((int));
-static void ipcp_close __P((int, char *));
-static void ipcp_lowerup __P((int));
-static void ipcp_lowerdown __P((int));
-static void ipcp_input __P((int, u_char *, int));
-static void ipcp_protrej __P((int));
-static int ipcp_printpkt __P((u_char *, int,
- void (*) __P((void *, char *, ...)), void *));
-static void ip_check_options __P((void));
-static int ip_demand_conf __P((int));
-static int ip_active_pkt __P((u_char *, int));
-static void create_resolv __P((u_int32_t, u_int32_t));
-
-struct protent ipcp_protent = {
- PPP_IPCP,
- ipcp_init,
- ipcp_input,
- ipcp_protrej,
- ipcp_lowerup,
- ipcp_lowerdown,
- ipcp_open,
- ipcp_close,
- ipcp_printpkt,
- NULL,
- 1,
- "IPCP",
- "IP",
- ipcp_option_list,
- ip_check_options,
- ip_demand_conf,
- ip_active_pkt
-};
-
-static void ipcp_clear_addrs __P((int, u_int32_t, u_int32_t));
-
-/*
- * Lengths of configuration options.
- */
-#define CILEN_VOID 2
-#define CILEN_COMPRESS 4 /* min length for compression protocol opt. */
-#define CILEN_VJ 6 /* length for RFC1332 Van-Jacobson opt. */
-#define CILEN_ADDR 6 /* new-style single address option */
-#define CILEN_ADDRS 10 /* old-style dual address option */
-
-
-#define CODENAME(x) ((x) == CONFACK ? "ACK" : \
- (x) == CONFNAK ? "NAK" : "REJ")
-
-/*
- * Make a string representation of a network IP address.
- */
-char *
-ip_ntoa(ipaddr)
-u_int32_t ipaddr;
-{
- static char b[64];
-
- slprintf(b, sizeof(b), "%I", ipaddr);
- return b;
-}
-
-/*
- * Option parsing.
- */
-
-/*
- * setvjslots - set maximum number of connection slots for VJ compression
- */
-static int
-setvjslots(argv)
- char **argv;
-{
- int value;
-
- if (!int_option(*argv, &value))
- return 0;
- if (value < 2 || value > 16) {
- option_error("vj-max-slots value must be between 2 and 16");
- return 0;
- }
- ipcp_wantoptions [0].maxslotindex =
- ipcp_allowoptions[0].maxslotindex = value - 1;
- return 1;
-}
-
-/*
- * setdnsaddr - set the dns address(es)
- */
-static int
-setdnsaddr(argv)
- char **argv;
-{
- u_int32_t dns;
- struct hostent *hp;
-
- dns = inet_addr(*argv);
- if (dns == (u_int32_t) -1) {
- if ((hp = gethostbyname(*argv)) == NULL) {
- option_error("invalid address parameter '%s' for ms-dns option",
- *argv);
- return 0;
- }
- dns = *(u_int32_t *)hp->h_addr;
- }
-
- /* if there is no primary then update it. */
- if (ipcp_allowoptions[0].dnsaddr[0] == 0)
- ipcp_allowoptions[0].dnsaddr[0] = dns;
-
- /* always set the secondary address value to the same value. */
- ipcp_allowoptions[0].dnsaddr[1] = dns;
-
- return (1);
-}
-
-/*
- * setwinsaddr - set the wins address(es)
- * This is primrarly used with the Samba package under UNIX or for pointing
- * the caller to the existing WINS server on a Windows NT platform.
- */
-static int
-setwinsaddr(argv)
- char **argv;
-{
- u_int32_t wins;
- struct hostent *hp;
-
- wins = inet_addr(*argv);
- if (wins == (u_int32_t) -1) {
- if ((hp = gethostbyname(*argv)) == NULL) {
- option_error("invalid address parameter '%s' for ms-wins option",
- *argv);
- return 0;
- }
- wins = *(u_int32_t *)hp->h_addr;
- }
-
- /* if there is no primary then update it. */
- if (ipcp_allowoptions[0].winsaddr[0] == 0)
- ipcp_allowoptions[0].winsaddr[0] = wins;
-
- /* always set the secondary address value to the same value. */
- ipcp_allowoptions[0].winsaddr[1] = wins;
-
- return (1);
-}
-
-
-/*
- * ipcp_init - Initialize IPCP.
- */
-static void
-ipcp_init(unit)
- int unit;
-{
- fsm *f = &ipcp_fsm[unit];
- ipcp_options *wo = &ipcp_wantoptions[unit];
- ipcp_options *ao = &ipcp_allowoptions[unit];
-
- f->unit = unit;
- f->protocol = PPP_IPCP;
- f->callbacks = &ipcp_callbacks;
- fsm_init(&ipcp_fsm[unit]);
-
- memset(wo, 0, sizeof(*wo));
- memset(ao, 0, sizeof(*ao));
-
- wo->neg_addr = 1;
- wo->neg_vj = 1;
- wo->vj_protocol = IPCP_VJ_COMP;
- wo->maxslotindex = MAX_STATES - 1; /* really max index */
- wo->cflag = 1;
-
- /* max slots and slot-id compression are currently hardwired in */
- /* ppp_if.c to 16 and 1, this needs to be changed (among other */
- /* things) gmc */
-
- ao->neg_addr = 1;
- ao->neg_vj = 1;
- ao->maxslotindex = MAX_STATES - 1;
- ao->cflag = 1;
-
- /*
- * XXX These control whether the user may use the proxyarp
- * and defaultroute options.
- */
- ao->proxy_arp = 1;
- ao->default_route = 1;
-}
-
-
-/*
- * ipcp_open - IPCP is allowed to come up.
- */
-static void
-ipcp_open(unit)
- int unit;
-{
- fsm_open(&ipcp_fsm[unit]);
-}
-
-
-/*
- * ipcp_close - Take IPCP down.
- */
-static void
-ipcp_close(unit, reason)
- int unit;
- char *reason;
-{
- fsm_close(&ipcp_fsm[unit], reason);
-}
-
-
-/*
- * ipcp_lowerup - The lower layer is up.
- */
-static void
-ipcp_lowerup(unit)
- int unit;
-{
- fsm_lowerup(&ipcp_fsm[unit]);
-}
-
-
-/*
- * ipcp_lowerdown - The lower layer is down.
- */
-static void
-ipcp_lowerdown(unit)
- int unit;
-{
- fsm_lowerdown(&ipcp_fsm[unit]);
-}
-
-
-/*
- * ipcp_input - Input IPCP packet.
- */
-static void
-ipcp_input(unit, p, len)
- int unit;
- u_char *p;
- int len;
-{
- fsm_input(&ipcp_fsm[unit], p, len);
-}
-
-
-/*
- * ipcp_protrej - A Protocol-Reject was received for IPCP.
- *
- * Pretend the lower layer went down, so we shut up.
- */
-static void
-ipcp_protrej(unit)
- int unit;
-{
- fsm_lowerdown(&ipcp_fsm[unit]);
-}
-
-
-/*
- * ipcp_resetci - Reset our CI.
- * Called by fsm_sconfreq, Send Configure Request.
- */
-static void
-ipcp_resetci(f)
- fsm *f;
-{
- ipcp_options *wo = &ipcp_wantoptions[f->unit];
- ipcp_options *go = &ipcp_gotoptions[f->unit];
-
- wo->req_addr = wo->neg_addr && ipcp_allowoptions[f->unit].neg_addr;
- if (wo->ouraddr == 0 || disable_defaultip)
- wo->accept_local = 1;
- if (wo->hisaddr == 0)
- wo->accept_remote = 1;
- wo->req_dns1 = usepeerdns; /* Request DNS addresses from the peer */
- wo->req_dns2 = usepeerdns;
- *go = *wo;
- if (disable_defaultip)
- go->ouraddr = 0;
-}
-
-
-/*
- * ipcp_cilen - Return length of our CI.
- * Called by fsm_sconfreq, Send Configure Request.
- */
-static int
-ipcp_cilen(f)
- fsm *f;
-{
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- ipcp_options *wo = &ipcp_wantoptions[f->unit];
- ipcp_options *ho = &ipcp_hisoptions[f->unit];
-
-#define LENCIVJ(neg, old) (neg ? (old? CILEN_COMPRESS : CILEN_VJ) : 0)
-#define LENCIADDR(neg, old) (neg ? (old? CILEN_ADDRS : CILEN_ADDR) : 0)
-#define LENCIDNS(neg) (neg ? (CILEN_ADDR) : 0)
-
- /*
- * First see if we want to change our options to the old
- * forms because we have received old forms from the peer.
- */
- if (wo->neg_addr && !go->neg_addr && !go->old_addrs) {
- /* use the old style of address negotiation */
- go->neg_addr = 1;
- go->old_addrs = 1;
- }
- if (wo->neg_vj && !go->neg_vj && !go->old_vj) {
- /* try an older style of VJ negotiation */
- /* use the old style only if the peer did */
- if (ho->neg_vj && ho->old_vj) {
- go->neg_vj = 1;
- go->old_vj = 1;
- go->vj_protocol = ho->vj_protocol;
- }
- }
-
- return (LENCIADDR(go->neg_addr, go->old_addrs) +
- LENCIVJ(go->neg_vj, go->old_vj) +
- LENCIDNS(go->req_dns1) +
- LENCIDNS(go->req_dns2)) ;
-}
-
-
-/*
- * ipcp_addci - Add our desired CIs to a packet.
- * Called by fsm_sconfreq, Send Configure Request.
- */
-static void
-ipcp_addci(f, ucp, lenp)
- fsm *f;
- u_char *ucp;
- int *lenp;
-{
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- int len = *lenp;
-
-#define ADDCIVJ(opt, neg, val, old, maxslotindex, cflag) \
- if (neg) { \
- int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \
- if (len >= vjlen) { \
- PUTCHAR(opt, ucp); \
- PUTCHAR(vjlen, ucp); \
- PUTSHORT(val, ucp); \
- if (!old) { \
- PUTCHAR(maxslotindex, ucp); \
- PUTCHAR(cflag, ucp); \
- } \
- len -= vjlen; \
- } else \
- neg = 0; \
- }
-
-#define ADDCIADDR(opt, neg, old, val1, val2) \
- if (neg) { \
- int addrlen = (old? CILEN_ADDRS: CILEN_ADDR); \
- if (len >= addrlen) { \
- u_int32_t l; \
- PUTCHAR(opt, ucp); \
- PUTCHAR(addrlen, ucp); \
- l = ntohl(val1); \
- PUTLONG(l, ucp); \
- if (old) { \
- l = ntohl(val2); \
- PUTLONG(l, ucp); \
- } \
- len -= addrlen; \
- } else \
- neg = 0; \
- }
-
-#define ADDCIDNS(opt, neg, addr) \
- if (neg) { \
- if (len >= CILEN_ADDR) { \
- u_int32_t l; \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_ADDR, ucp); \
- l = ntohl(addr); \
- PUTLONG(l, ucp); \
- len -= CILEN_ADDR; \
- } else \
- neg = 0; \
- }
-
- ADDCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), go->neg_addr,
- go->old_addrs, go->ouraddr, go->hisaddr);
-
- ADDCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,
- go->maxslotindex, go->cflag);
-
- ADDCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);
-
- ADDCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);
-
- *lenp -= len;
-}
-
-
-/*
- * ipcp_ackci - Ack our CIs.
- * Called by fsm_rconfack, Receive Configure ACK.
- *
- * Returns:
- * 0 - Ack was bad.
- * 1 - Ack was good.
- */
-static int
-ipcp_ackci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- u_short cilen, citype, cishort;
- u_int32_t cilong;
- u_char cimaxslotindex, cicflag;
-
- /*
- * CIs must be in exactly the same order that we sent...
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-
-#define ACKCIVJ(opt, neg, val, old, maxslotindex, cflag) \
- if (neg) { \
- int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \
- if ((len -= vjlen) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != vjlen || \
- citype != opt) \
- goto bad; \
- GETSHORT(cishort, p); \
- if (cishort != val) \
- goto bad; \
- if (!old) { \
- GETCHAR(cimaxslotindex, p); \
- if (cimaxslotindex != maxslotindex) \
- goto bad; \
- GETCHAR(cicflag, p); \
- if (cicflag != cflag) \
- goto bad; \
- } \
- }
-
-#define ACKCIADDR(opt, neg, old, val1, val2) \
- if (neg) { \
- int addrlen = (old? CILEN_ADDRS: CILEN_ADDR); \
- u_int32_t l; \
- if ((len -= addrlen) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != addrlen || \
- citype != opt) \
- goto bad; \
- GETLONG(l, p); \
- cilong = htonl(l); \
- if (val1 != cilong) \
- goto bad; \
- if (old) { \
- GETLONG(l, p); \
- cilong = htonl(l); \
- if (val2 != cilong) \
- goto bad; \
- } \
- }
-
-#define ACKCIDNS(opt, neg, addr) \
- if (neg) { \
- u_int32_t l; \
- if ((len -= CILEN_ADDR) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_ADDR || citype != opt) \
- goto bad; \
- GETLONG(l, p); \
- cilong = htonl(l); \
- if (addr != cilong) \
- goto bad; \
- }
-
- ACKCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), go->neg_addr,
- go->old_addrs, go->ouraddr, go->hisaddr);
-
- ACKCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,
- go->maxslotindex, go->cflag);
-
- ACKCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);
-
- ACKCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);
-
- /*
- * If there are any remaining CIs, then this packet is bad.
- */
- if (len != 0)
- goto bad;
- return (1);
-
-bad:
- IPCPDEBUG(("ipcp_ackci: received bad Ack!"));
- return (0);
-}
-
-/*
- * ipcp_nakci - Peer has sent a NAK for some of our CIs.
- * This should not modify any state if the Nak is bad
- * or if IPCP is in the OPENED state.
- * Calback from fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.
- *
- * Returns:
- * 0 - Nak was bad.
- * 1 - Nak was good.
- */
-static int
-ipcp_nakci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- u_char cimaxslotindex, cicflag;
- u_char citype, cilen, *next;
- u_short cishort;
- u_int32_t ciaddr1, ciaddr2, l, cidnsaddr;
- ipcp_options no; /* options we've seen Naks for */
- ipcp_options try; /* options to request next time */
-
- BZERO(&no, sizeof(no));
- try = *go;
-
- /*
- * Any Nak'd CIs must be in exactly the same order that we sent.
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-#define NAKCIADDR(opt, neg, old, code) \
- if (go->neg && \
- len >= (cilen = (old? CILEN_ADDRS: CILEN_ADDR)) && \
- p[1] == cilen && \
- p[0] == opt) { \
- len -= cilen; \
- INCPTR(2, p); \
- GETLONG(l, p); \
- ciaddr1 = htonl(l); \
- if (old) { \
- GETLONG(l, p); \
- ciaddr2 = htonl(l); \
- no.old_addrs = 1; \
- } else \
- ciaddr2 = 0; \
- no.neg = 1; \
- code \
- }
-
-#define NAKCIVJ(opt, neg, code) \
- if (go->neg && \
- ((cilen = p[1]) == CILEN_COMPRESS || cilen == CILEN_VJ) && \
- len >= cilen && \
- p[0] == opt) { \
- len -= cilen; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- no.neg = 1; \
- code \
- }
-
-#define NAKCIDNS(opt, neg, code) \
- if (go->neg && \
- ((cilen = p[1]) == CILEN_ADDR) && \
- len >= cilen && \
- p[0] == opt) { \
- len -= cilen; \
- INCPTR(2, p); \
- GETLONG(l, p); \
- cidnsaddr = htonl(l); \
- no.neg = 1; \
- code \
- }
-
- /*
- * Accept the peer's idea of {our,his} address, if different
- * from our idea, only if the accept_{local,remote} flag is set.
- */
- NAKCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), neg_addr, go->old_addrs,
- if (go->accept_local && ciaddr1) { /* Do we know our address? */
- try.ouraddr = ciaddr1;
- }
- if (go->accept_remote && ciaddr2) { /* Does he know his? */
- try.hisaddr = ciaddr2;
- }
- );
-
- /*
- * Accept the peer's value of maxslotindex provided that it
- * is less than what we asked for. Turn off slot-ID compression
- * if the peer wants. Send old-style compress-type option if
- * the peer wants.
- */
- NAKCIVJ(CI_COMPRESSTYPE, neg_vj,
- if (cilen == CILEN_VJ) {
- GETCHAR(cimaxslotindex, p);
- GETCHAR(cicflag, p);
- if (cishort == IPCP_VJ_COMP) {
- try.old_vj = 0;
- if (cimaxslotindex < go->maxslotindex)
- try.maxslotindex = cimaxslotindex;
- if (!cicflag)
- try.cflag = 0;
- } else {
- try.neg_vj = 0;
- }
- } else {
- if (cishort == IPCP_VJ_COMP || cishort == IPCP_VJ_COMP_OLD) {
- try.old_vj = 1;
- try.vj_protocol = cishort;
- } else {
- try.neg_vj = 0;
- }
- }
- );
-
- NAKCIDNS(CI_MS_DNS1, req_dns1,
- try.dnsaddr[0] = cidnsaddr;
- );
-
- NAKCIDNS(CI_MS_DNS2, req_dns2,
- try.dnsaddr[1] = cidnsaddr;
- );
-
- /*
- * There may be remaining CIs, if the peer is requesting negotiation
- * on an option that we didn't include in our request packet.
- * If they want to negotiate about IP addresses, we comply.
- * If they want us to ask for compression, we refuse.
- */
- while (len > CILEN_VOID) {
- GETCHAR(citype, p);
- GETCHAR(cilen, p);
- if( (len -= cilen) < 0 )
- goto bad;
- next = p + cilen - 2;
-
- switch (citype) {
- case CI_COMPRESSTYPE:
- if (go->neg_vj || no.neg_vj ||
- (cilen != CILEN_VJ && cilen != CILEN_COMPRESS))
- goto bad;
- no.neg_vj = 1;
- break;
- case CI_ADDRS:
- if ((go->neg_addr && go->old_addrs) || no.old_addrs
- || cilen != CILEN_ADDRS)
- goto bad;
- try.neg_addr = 1;
- try.old_addrs = 1;
- GETLONG(l, p);
- ciaddr1 = htonl(l);
- if (ciaddr1 && go->accept_local)
- try.ouraddr = ciaddr1;
- GETLONG(l, p);
- ciaddr2 = htonl(l);
- if (ciaddr2 && go->accept_remote)
- try.hisaddr = ciaddr2;
- no.old_addrs = 1;
- break;
- case CI_ADDR:
- if (go->neg_addr || no.neg_addr || cilen != CILEN_ADDR)
- goto bad;
- try.old_addrs = 0;
- GETLONG(l, p);
- ciaddr1 = htonl(l);
- if (ciaddr1 && go->accept_local)
- try.ouraddr = ciaddr1;
- if (try.ouraddr != 0)
- try.neg_addr = 1;
- no.neg_addr = 1;
- break;
- }
- p = next;
- }
-
- /*
- * OK, the Nak is good. Now we can update state.
- * If there are any remaining options, we ignore them.
- */
- if (f->state != OPENED)
- *go = try;
-
- return 1;
-
-bad:
- IPCPDEBUG(("ipcp_nakci: received bad Nak!"));
- return 0;
-}
-
-
-/*
- * ipcp_rejci - Reject some of our CIs.
- * Callback from fsm_rconfnakrej.
- */
-static int
-ipcp_rejci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- u_char cimaxslotindex, ciflag, cilen;
- u_short cishort;
- u_int32_t cilong;
- ipcp_options try; /* options to request next time */
-
- try = *go;
- /*
- * Any Rejected CIs must be in exactly the same order that we sent.
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-#define REJCIADDR(opt, neg, old, val1, val2) \
- if (go->neg && \
- len >= (cilen = old? CILEN_ADDRS: CILEN_ADDR) && \
- p[1] == cilen && \
- p[0] == opt) { \
- u_int32_t l; \
- len -= cilen; \
- INCPTR(2, p); \
- GETLONG(l, p); \
- cilong = htonl(l); \
- /* Check rejected value. */ \
- if (cilong != val1) \
- goto bad; \
- if (old) { \
- GETLONG(l, p); \
- cilong = htonl(l); \
- /* Check rejected value. */ \
- if (cilong != val2) \
- goto bad; \
- } \
- try.neg = 0; \
- }
-
-#define REJCIVJ(opt, neg, val, old, maxslot, cflag) \
- if (go->neg && \
- p[1] == (old? CILEN_COMPRESS : CILEN_VJ) && \
- len >= p[1] && \
- p[0] == opt) { \
- len -= p[1]; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- /* Check rejected value. */ \
- if (cishort != val) \
- goto bad; \
- if (!old) { \
- GETCHAR(cimaxslotindex, p); \
- if (cimaxslotindex != maxslot) \
- goto bad; \
- GETCHAR(ciflag, p); \
- if (ciflag != cflag) \
- goto bad; \
- } \
- try.neg = 0; \
- }
-
-#define REJCIDNS(opt, neg, dnsaddr) \
- if (go->neg && \
- ((cilen = p[1]) == CILEN_ADDR) && \
- len >= cilen && \
- p[0] == opt) { \
- u_int32_t l; \
- len -= cilen; \
- INCPTR(2, p); \
- GETLONG(l, p); \
- cilong = htonl(l); \
- /* Check rejected value. */ \
- if (cilong != dnsaddr) \
- goto bad; \
- try.neg = 0; \
- }
-
-
- REJCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), neg_addr,
- go->old_addrs, go->ouraddr, go->hisaddr);
-
- REJCIVJ(CI_COMPRESSTYPE, neg_vj, go->vj_protocol, go->old_vj,
- go->maxslotindex, go->cflag);
-
- REJCIDNS(CI_MS_DNS1, req_dns1, go->dnsaddr[0]);
-
- REJCIDNS(CI_MS_DNS2, req_dns2, go->dnsaddr[1]);
-
- /*
- * If there are any remaining CIs, then this packet is bad.
- */
- if (len != 0)
- goto bad;
- /*
- * Now we can update state.
- */
- if (f->state != OPENED)
- *go = try;
- return 1;
-
-bad:
- IPCPDEBUG(("ipcp_rejci: received bad Reject!"));
- return 0;
-}
-
-
-/*
- * ipcp_reqci - Check the peer's requested CIs and send appropriate response.
- * Callback from fsm_rconfreq, Receive Configure Request
- *
- * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified
- * appropriately. If reject_if_disagree is non-zero, doesn't return
- * CONFNAK; returns CONFREJ if it can't return CONFACK.
- */
-static int
-ipcp_reqci(f, inp, len, reject_if_disagree)
- fsm *f;
- u_char *inp; /* Requested CIs */
- int *len; /* Length of requested CIs */
- int reject_if_disagree;
-{
- ipcp_options *wo = &ipcp_wantoptions[f->unit];
- ipcp_options *ho = &ipcp_hisoptions[f->unit];
- ipcp_options *ao = &ipcp_allowoptions[f->unit];
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- u_char *cip, *next; /* Pointer to current and next CIs */
- u_short cilen, citype; /* Parsed len, type */
- u_short cishort; /* Parsed short value */
- u_int32_t tl, ciaddr1, ciaddr2;/* Parsed address values */
- int rc = CONFACK; /* Final packet return code */
- int orc; /* Individual option return code */
- u_char *p; /* Pointer to next char to parse */
- u_char *ucp = inp; /* Pointer to current output char */
- int l = *len; /* Length left */
- u_char maxslotindex, cflag;
- int d;
-
- /*
- * Reset all his options.
- */
- BZERO(ho, sizeof(*ho));
-
- /*
- * Process all his options.
- */
- next = inp;
- while (l) {
- orc = CONFACK; /* Assume success */
- cip = p = next; /* Remember begining of CI */
- if (l < 2 || /* Not enough data for CI header or */
- p[1] < 2 || /* CI length too small or */
- p[1] > l) { /* CI length too big? */
- IPCPDEBUG(("ipcp_reqci: bad CI length!"));
- orc = CONFREJ; /* Reject bad CI */
- cilen = l; /* Reject till end of packet */
- l = 0; /* Don't loop again */
- goto endswitch;
- }
- GETCHAR(citype, p); /* Parse CI type */
- GETCHAR(cilen, p); /* Parse CI length */
- l -= cilen; /* Adjust remaining length */
- next += cilen; /* Step to next CI */
-
- switch (citype) { /* Check CI type */
- case CI_ADDRS:
- if (!ao->neg_addr ||
- cilen != CILEN_ADDRS) { /* Check CI length */
- orc = CONFREJ; /* Reject CI */
- break;
- }
-
- /*
- * If he has no address, or if we both have his address but
- * disagree about it, then NAK it with our idea.
- * In particular, if we don't know his address, but he does,
- * then accept it.
- */
- GETLONG(tl, p); /* Parse source address (his) */
- ciaddr1 = htonl(tl);
- if (ciaddr1 != wo->hisaddr
- && (ciaddr1 == 0 || !wo->accept_remote)) {
- orc = CONFNAK;
- if (!reject_if_disagree) {
- DECPTR(sizeof(u_int32_t), p);
- tl = ntohl(wo->hisaddr);
- PUTLONG(tl, p);
- }
- } else if (ciaddr1 == 0 && wo->hisaddr == 0) {
- /*
- * If neither we nor he knows his address, reject the option.
- */
- orc = CONFREJ;
- wo->req_addr = 0; /* don't NAK with 0.0.0.0 later */
- break;
- }
-
- /*
- * If he doesn't know our address, or if we both have our address
- * but disagree about it, then NAK it with our idea.
- */
- GETLONG(tl, p); /* Parse desination address (ours) */
- ciaddr2 = htonl(tl);
- if (ciaddr2 != wo->ouraddr) {
- if (ciaddr2 == 0 || !wo->accept_local) {
- orc = CONFNAK;
- if (!reject_if_disagree) {
- DECPTR(sizeof(u_int32_t), p);
- tl = ntohl(wo->ouraddr);
- PUTLONG(tl, p);
- }
- } else {
- go->ouraddr = ciaddr2; /* accept peer's idea */
- }
- }
-
- ho->neg_addr = 1;
- ho->old_addrs = 1;
- ho->hisaddr = ciaddr1;
- ho->ouraddr = ciaddr2;
- break;
-
- case CI_ADDR:
- if (!ao->neg_addr ||
- cilen != CILEN_ADDR) { /* Check CI length */
- orc = CONFREJ; /* Reject CI */
- break;
- }
-
- /*
- * If he has no address, or if we both have his address but
- * disagree about it, then NAK it with our idea.
- * In particular, if we don't know his address, but he does,
- * then accept it.
- */
- GETLONG(tl, p); /* Parse source address (his) */
- ciaddr1 = htonl(tl);
- if (ciaddr1 != wo->hisaddr
- && (ciaddr1 == 0 || !wo->accept_remote)) {
- orc = CONFNAK;
- if (!reject_if_disagree) {
- DECPTR(sizeof(u_int32_t), p);
- tl = ntohl(wo->hisaddr);
- PUTLONG(tl, p);
- }
- } else if (ciaddr1 == 0 && wo->hisaddr == 0) {
- /*
- * Don't ACK an address of 0.0.0.0 - reject it instead.
- */
- orc = CONFREJ;
- wo->req_addr = 0; /* don't NAK with 0.0.0.0 later */
- break;
- }
-
- ho->neg_addr = 1;
- ho->hisaddr = ciaddr1;
- break;
-
- case CI_MS_DNS1:
- case CI_MS_DNS2:
- /* Microsoft primary or secondary DNS request */
- d = citype == CI_MS_DNS2;
-
- /* If we do not have a DNS address then we cannot send it */
- if (ao->dnsaddr[d] == 0 ||
- cilen != CILEN_ADDR) { /* Check CI length */
- orc = CONFREJ; /* Reject CI */
- break;
- }
- GETLONG(tl, p);
- if (htonl(tl) != ao->dnsaddr[d]) {
- DECPTR(sizeof(u_int32_t), p);
- tl = ntohl(ao->dnsaddr[d]);
- PUTLONG(tl, p);
- orc = CONFNAK;
- }
- break;
-
- case CI_MS_WINS1:
- case CI_MS_WINS2:
- /* Microsoft primary or secondary WINS request */
- d = citype == CI_MS_WINS2;
-
- /* If we do not have a DNS address then we cannot send it */
- if (ao->winsaddr[d] == 0 ||
- cilen != CILEN_ADDR) { /* Check CI length */
- orc = CONFREJ; /* Reject CI */
- break;
- }
- GETLONG(tl, p);
- if (htonl(tl) != ao->winsaddr[d]) {
- DECPTR(sizeof(u_int32_t), p);
- tl = ntohl(ao->winsaddr[d]);
- PUTLONG(tl, p);
- orc = CONFNAK;
- }
- break;
-
- case CI_COMPRESSTYPE:
- if (!ao->neg_vj ||
- (cilen != CILEN_VJ && cilen != CILEN_COMPRESS)) {
- orc = CONFREJ;
- break;
- }
- GETSHORT(cishort, p);
-
- if (!(cishort == IPCP_VJ_COMP ||
- (cishort == IPCP_VJ_COMP_OLD && cilen == CILEN_COMPRESS))) {
- orc = CONFREJ;
- break;
- }
-
- ho->neg_vj = 1;
- ho->vj_protocol = cishort;
- if (cilen == CILEN_VJ) {
- GETCHAR(maxslotindex, p);
- if (maxslotindex > ao->maxslotindex) {
- orc = CONFNAK;
- if (!reject_if_disagree){
- DECPTR(1, p);
- PUTCHAR(ao->maxslotindex, p);
- }
- }
- GETCHAR(cflag, p);
- if (cflag && !ao->cflag) {
- orc = CONFNAK;
- if (!reject_if_disagree){
- DECPTR(1, p);
- PUTCHAR(wo->cflag, p);
- }
- }
- ho->maxslotindex = maxslotindex;
- ho->cflag = cflag;
- } else {
- ho->old_vj = 1;
- ho->maxslotindex = MAX_STATES - 1;
- ho->cflag = 1;
- }
- break;
-
- default:
- orc = CONFREJ;
- break;
- }
-endswitch:
- if (orc == CONFACK && /* Good CI */
- rc != CONFACK) /* but prior CI wasnt? */
- continue; /* Don't send this one */
-
- if (orc == CONFNAK) { /* Nak this CI? */
- if (reject_if_disagree) /* Getting fed up with sending NAKs? */
- orc = CONFREJ; /* Get tough if so */
- else {
- if (rc == CONFREJ) /* Rejecting prior CI? */
- continue; /* Don't send this one */
- if (rc == CONFACK) { /* Ack'd all prior CIs? */
- rc = CONFNAK; /* Not anymore... */
- ucp = inp; /* Backup */
- }
- }
- }
-
- if (orc == CONFREJ && /* Reject this CI */
- rc != CONFREJ) { /* but no prior ones? */
- rc = CONFREJ;
- ucp = inp; /* Backup */
- }
-
- /* Need to move CI? */
- if (ucp != cip)
- BCOPY(cip, ucp, cilen); /* Move it */
-
- /* Update output pointer */
- INCPTR(cilen, ucp);
- }
-
- /*
- * If we aren't rejecting this packet, and we want to negotiate
- * their address, and they didn't send their address, then we
- * send a NAK with a CI_ADDR option appended. We assume the
- * input buffer is long enough that we can append the extra
- * option safely.
- */
- if (rc != CONFREJ && !ho->neg_addr &&
- wo->req_addr && !reject_if_disagree) {
- if (rc == CONFACK) {
- rc = CONFNAK;
- ucp = inp; /* reset pointer */
- wo->req_addr = 0; /* don't ask again */
- }
- PUTCHAR(CI_ADDR, ucp);
- PUTCHAR(CILEN_ADDR, ucp);
- tl = ntohl(wo->hisaddr);
- PUTLONG(tl, ucp);
- }
-
- *len = ucp - inp; /* Compute output length */
- IPCPDEBUG(("ipcp: returning Configure-%s", CODENAME(rc)));
- return (rc); /* Return final code */
-}
-
-
-/*
- * ip_check_options - check that any IP-related options are OK,
- * and assign appropriate defaults.
- */
-static void
-ip_check_options()
-{
- struct hostent *hp;
- u_int32_t local;
- ipcp_options *wo = &ipcp_wantoptions[0];
-
- /*
- * Default our local IP address based on our hostname.
- * If local IP address already given, don't bother.
- */
- if (wo->ouraddr == 0) {
- /*
- * Look up our hostname (possibly with domain name appended)
- * and take the first IP address as our local IP address.
- * If there isn't an IP address for our hostname, too bad.
- */
- wo->accept_local = 1; /* don't insist on this default value */
- if ((hp = gethostbyname(hostname)) != NULL) {
- local = *(u_int32_t *)hp->h_addr;
- if (local != 0 && !bad_ip_adrs(local))
- wo->ouraddr = local;
- }
- }
-}
-
-
-/*
- * ip_demand_conf - configure the interface as though
- * IPCP were up, for use with dial-on-demand.
- */
-static int
-ip_demand_conf(u)
- int u;
-{
- ipcp_options *wo = &ipcp_wantoptions[u];
-
- if (wo->hisaddr == 0) {
- /* make up an arbitrary address for the peer */
- wo->hisaddr = htonl(0x0a707070 + pppifunit);
- wo->accept_remote = 1;
- }
- if (wo->ouraddr == 0) {
- /* make up an arbitrary address for us */
- wo->ouraddr = htonl(0x0a404040 + pppifunit);
- wo->accept_local = 1;
- disable_defaultip = 1; /* don't tell the peer this address */
- }
- if (!sifaddr(u, wo->ouraddr, wo->hisaddr, GetMask(wo->ouraddr)))
- return 0;
- if (!sifup(u))
- return 0;
- if (!sifnpmode(u, PPP_IP, NPMODE_QUEUE))
- return 0;
- if (wo->default_route)
- if (sifdefaultroute(u, wo->ouraddr, wo->hisaddr))
- default_route_set[u] = 1;
- if (wo->proxy_arp)
- if (sifproxyarp(u, wo->hisaddr))
- proxy_arp_set[u] = 1;
-
- notice("local IP address %I", wo->ouraddr);
- notice("remote IP address %I", wo->hisaddr);
-
- return 1;
-}
-
-
-/*
- * ipcp_up - IPCP has come UP.
- *
- * Configure the IP network interface appropriately and bring it up.
- */
-static void
-ipcp_up(f)
- fsm *f;
-{
- u_int32_t mask;
- ipcp_options *ho = &ipcp_hisoptions[f->unit];
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- ipcp_options *wo = &ipcp_wantoptions[f->unit];
-
- IPCPDEBUG(("ipcp: up"));
-
- /*
- * We must have a non-zero IP address for both ends of the link.
- */
- if (!ho->neg_addr)
- ho->hisaddr = wo->hisaddr;
-
- if (ho->hisaddr == 0) {
- error("Could not determine remote IP address");
- ipcp_close(f->unit, "Could not determine remote IP address");
- return;
- }
- if (go->ouraddr == 0) {
- error("Could not determine local IP address");
- ipcp_close(f->unit, "Could not determine local IP address");
- return;
- }
-
- if (usepeerdns && (go->dnsaddr[0] || go->dnsaddr[1])) {
- create_resolv(go->dnsaddr[0], go->dnsaddr[1]);
- }
-
- /*
- * Check that the peer is allowed to use the IP address it wants.
- */
- if (!auth_ip_addr(f->unit, ho->hisaddr)) {
- error("Peer is not authorized to use remote address %I", ho->hisaddr);
- ipcp_close(f->unit, "Unauthorized remote IP address");
- return;
- }
-
- /* set tcp compression */
- sifvjcomp(f->unit, ho->neg_vj, ho->cflag, ho->maxslotindex);
-
- /*
- * If we are doing dial-on-demand, the interface is already
- * configured, so we put out any saved-up packets, then set the
- * interface to pass IP packets.
- */
- if (demand) {
- if (go->ouraddr != wo->ouraddr || ho->hisaddr != wo->hisaddr) {
- ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr);
- if (go->ouraddr != wo->ouraddr) {
- warn("Local IP address changed to %I", go->ouraddr);
- wo->ouraddr = go->ouraddr;
- }
- if (ho->hisaddr != wo->hisaddr) {
- warn("Remote IP address changed to %I", ho->hisaddr);
- wo->hisaddr = ho->hisaddr;
- }
-
- /* Set the interface to the new addresses */
- mask = GetMask(go->ouraddr);
- if (!sifaddr(f->unit, go->ouraddr, ho->hisaddr, mask)) {
- if (debug)
- warn("Interface configuration failed");
- ipcp_close(f->unit, "Interface configuration failed");
- return;
- }
-
- /* assign a default route through the interface if required */
- if (ipcp_wantoptions[f->unit].default_route)
- if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr))
- default_route_set[f->unit] = 1;
-
- /* Make a proxy ARP entry if requested. */
- if (ipcp_wantoptions[f->unit].proxy_arp)
- if (sifproxyarp(f->unit, ho->hisaddr))
- proxy_arp_set[f->unit] = 1;
-
- }
- demand_rexmit(PPP_IP);
- sifnpmode(f->unit, PPP_IP, NPMODE_PASS);
-
- } else {
- /*
- * Set IP addresses and (if specified) netmask.
- */
- mask = GetMask(go->ouraddr);
-
-#if !(defined(SVR4) && (defined(SNI) || defined(__USLC__)))
- if (!sifaddr(f->unit, go->ouraddr, ho->hisaddr, mask)) {
- if (debug)
- warn("Interface configuration failed");
- ipcp_close(f->unit, "Interface configuration failed");
- return;
- }
-#endif
-
- /* bring the interface up for IP */
- if (!sifup(f->unit)) {
- if (debug)
- warn("Interface failed to come up");
- ipcp_close(f->unit, "Interface configuration failed");
- return;
- }
-
-#if (defined(SVR4) && (defined(SNI) || defined(__USLC__)))
- if (!sifaddr(f->unit, go->ouraddr, ho->hisaddr, mask)) {
- if (debug)
- warn("Interface configuration failed");
- ipcp_close(f->unit, "Interface configuration failed");
- return;
- }
-#endif
- sifnpmode(f->unit, PPP_IP, NPMODE_PASS);
-
- /* assign a default route through the interface if required */
- if (ipcp_wantoptions[f->unit].default_route)
- if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr))
- default_route_set[f->unit] = 1;
-
- /* Make a proxy ARP entry if requested. */
- if (ipcp_wantoptions[f->unit].proxy_arp)
- if (sifproxyarp(f->unit, ho->hisaddr))
- proxy_arp_set[f->unit] = 1;
-
- ipcp_wantoptions[0].ouraddr = go->ouraddr;
-
- notice("local IP address %I", go->ouraddr);
- notice("remote IP address %I", ho->hisaddr);
- if (go->dnsaddr[0])
- notice("primary DNS address %I", go->dnsaddr[0]);
- if (go->dnsaddr[1])
- notice("secondary DNS address %I", go->dnsaddr[1]);
- }
-
- np_up(f->unit, PPP_IP);
- ipcp_is_up = 1;
-
- if (ip_up_hook)
- ip_up_hook();
-}
-
-
-/*
- * ipcp_down - IPCP has gone DOWN.
- *
- * Take the IP network interface down, clear its addresses
- * and delete routes through it.
- */
-static void
-ipcp_down(f)
- fsm *f;
-{
- IPCPDEBUG(("ipcp: down"));
- /* XXX a bit IPv4-centric here, we only need to get the stats
- * before the interface is marked down. */
- update_link_stats(f->unit);
- if (ip_down_hook)
- ip_down_hook();
- if (ipcp_is_up) {
- ipcp_is_up = 0;
- np_down(f->unit, PPP_IP);
- }
- sifvjcomp(f->unit, 0, 0, 0);
-
- /*
- * If we are doing dial-on-demand, set the interface
- * to queue up outgoing packets (for now).
- */
- if (demand) {
- sifnpmode(f->unit, PPP_IP, NPMODE_QUEUE);
- } else {
- sifnpmode(f->unit, PPP_IP, NPMODE_DROP);
- sifdown(f->unit);
- ipcp_clear_addrs(f->unit, ipcp_gotoptions[f->unit].ouraddr,
- ipcp_hisoptions[f->unit].hisaddr);
- }
-}
-
-
-/*
- * ipcp_clear_addrs() - clear the interface addresses, routes,
- * proxy arp entries, etc.
- */
-static void
-ipcp_clear_addrs(unit, ouraddr, hisaddr)
- int unit;
- u_int32_t ouraddr; /* local address */
- u_int32_t hisaddr; /* remote address */
-{
- if (proxy_arp_set[unit]) {
- cifproxyarp(unit, hisaddr);
- proxy_arp_set[unit] = 0;
- }
- if (default_route_set[unit]) {
- cifdefaultroute(unit, ouraddr, hisaddr);
- default_route_set[unit] = 0;
- }
- cifaddr(unit, ouraddr, hisaddr);
-}
-
-
-/*
- * ipcp_finished - possibly shut down the lower layers.
- */
-static void
-ipcp_finished(f)
- fsm *f;
-{
- np_finished(f->unit, PPP_IP);
-}
-
-/*
- * create_resolv - create the replacement resolv.conf file
- */
-static void
-create_resolv(peerdns1, peerdns2)
- u_int32_t peerdns1, peerdns2;
-{
- /* initialize values */
- rtems_bsdnet_nameserver_count = 0;
-
- /* check to see if primary was specified */
- if ( peerdns1 ) {
- rtems_bsdnet_nameserver[rtems_bsdnet_nameserver_count].s_addr = peerdns1;
- rtems_bsdnet_nameserver_count++;
- }
-
- /* check to see if secondary was specified */
- if ( peerdns2 ) {
- rtems_bsdnet_nameserver[rtems_bsdnet_nameserver_count].s_addr = peerdns2;
- rtems_bsdnet_nameserver_count++;
- }
-
- /* initialize resolver */
- __res_init();
-}
-
-/*
- * ipcp_printpkt - print the contents of an IPCP packet.
- */
-static char *ipcp_codenames[] = {
- "ConfReq", "ConfAck", "ConfNak", "ConfRej",
- "TermReq", "TermAck", "CodeRej"
-};
-
-static int
-ipcp_printpkt(p, plen, printer, arg)
- u_char *p;
- int plen;
- void (*printer) __P((void *, char *, ...));
- void *arg;
-{
- int code, id, len, olen;
- u_char *pstart, *optend;
- u_short cishort;
- u_int32_t cilong;
-
- if (plen < HEADERLEN)
- return 0;
- pstart = p;
- GETCHAR(code, p);
- GETCHAR(id, p);
- GETSHORT(len, p);
- if (len < HEADERLEN || len > plen)
- return 0;
-
- if (code >= 1 && code <= sizeof(ipcp_codenames) / sizeof(char *))
- printer(arg, " %s", ipcp_codenames[code-1]);
- else
- printer(arg, " code=0x%x", code);
- printer(arg, " id=0x%x", id);
- len -= HEADERLEN;
- switch (code) {
- case CONFREQ:
- case CONFACK:
- case CONFNAK:
- case CONFREJ:
- /* print option list */
- while (len >= 2) {
- GETCHAR(code, p);
- GETCHAR(olen, p);
- p -= 2;
- if (olen < 2 || olen > len) {
- break;
- }
- printer(arg, " <");
- len -= olen;
- optend = p + olen;
- switch (code) {
- case CI_ADDRS:
- if (olen == CILEN_ADDRS) {
- p += 2;
- GETLONG(cilong, p);
- printer(arg, "addrs %I", htonl(cilong));
- GETLONG(cilong, p);
- printer(arg, " %I", htonl(cilong));
- }
- break;
- case CI_COMPRESSTYPE:
- if (olen >= CILEN_COMPRESS) {
- p += 2;
- GETSHORT(cishort, p);
- printer(arg, "compress ");
- switch (cishort) {
- case IPCP_VJ_COMP:
- printer(arg, "VJ");
- break;
- case IPCP_VJ_COMP_OLD:
- printer(arg, "old-VJ");
- break;
- default:
- printer(arg, "0x%x", cishort);
- }
- }
- break;
- case CI_ADDR:
- if (olen == CILEN_ADDR) {
- p += 2;
- GETLONG(cilong, p);
- printer(arg, "addr %I", htonl(cilong));
- }
- break;
- case CI_MS_DNS1:
- case CI_MS_DNS2:
- p += 2;
- GETLONG(cilong, p);
- printer(arg, "ms-dns%d %I", code - CI_MS_DNS1 + 1,
- htonl(cilong));
- break;
- case CI_MS_WINS1:
- case CI_MS_WINS2:
- p += 2;
- GETLONG(cilong, p);
- printer(arg, "ms-wins %I", htonl(cilong));
- break;
- }
- while (p < optend) {
- GETCHAR(code, p);
- printer(arg, " %.2x", code);
- }
- printer(arg, ">");
- }
- break;
-
- case TERMACK:
- case TERMREQ:
- if (len > 0 && *p >= ' ' && *p < 0x7f) {
- printer(arg, " ");
- print_string(p, len, printer, arg);
- p += len;
- len = 0;
- }
- break;
- }
-
- /* print the rest of the bytes in the packet */
- for (; len > 0; --len) {
- GETCHAR(code, p);
- printer(arg, " %.2x", code);
- }
-
- return p - pstart;
-}
-
-/*
- * ip_active_pkt - see if this IP packet is worth bringing the link up for.
- * We don't bring the link up for IP fragments or for TCP FIN packets
- * with no data.
- */
-#define IP_HDRLEN 20 /* bytes */
-#define IP_OFFMASK 0x1fff
-#define IPPROTO_TCP 6
-#define TCP_HDRLEN 20
-#define TH_FIN 0x01
-
-/*
- * We use these macros because the IP header may be at an odd address,
- * and some compilers might use word loads to get th_off or ip_hl.
- */
-
-#define net_short(x) (((x)[0] << 8) + (x)[1])
-#define get_iphl(x) (((unsigned char *)(x))[0] & 0xF)
-#define get_ipoff(x) net_short((unsigned char *)(x) + 6)
-#define get_ipproto(x) (((unsigned char *)(x))[9])
-#define get_tcpoff(x) (((unsigned char *)(x))[12] >> 4)
-#define get_tcpflags(x) (((unsigned char *)(x))[13])
-
-static int
-ip_active_pkt(pkt, len)
- u_char *pkt;
- int len;
-{
- u_char *tcp;
- int hlen;
-
- len -= PPP_HDRLEN;
- pkt += PPP_HDRLEN;
- if (len < IP_HDRLEN)
- return 0;
- if ((get_ipoff(pkt) & IP_OFFMASK) != 0)
- return 0;
- if (get_ipproto(pkt) != IPPROTO_TCP)
- return 1;
- hlen = get_iphl(pkt) * 4;
- if (len < hlen + TCP_HDRLEN)
- return 0;
- tcp = pkt + hlen;
- if ((get_tcpflags(tcp) & TH_FIN) != 0 && len == hlen + get_tcpoff(tcp) * 4)
- return 0;
- return 1;
-}
diff --git a/c/src/libnetworking/pppd/ipcp.h b/c/src/libnetworking/pppd/ipcp.h
deleted file mode 100644
index 8c5aca861d..0000000000
--- a/c/src/libnetworking/pppd/ipcp.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * ipcp.h - IP Control Protocol definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id$
- */
-
-/*
- * Options.
- */
-#define CI_ADDRS 1 /* IP Addresses */
-#define CI_COMPRESSTYPE 2 /* Compression Type */
-#define CI_ADDR 3
-
-#define CI_MS_DNS1 129 /* Primary DNS value */
-#define CI_MS_WINS1 130 /* Primary WINS value */
-#define CI_MS_DNS2 131 /* Secondary DNS value */
-#define CI_MS_WINS2 132 /* Secondary WINS value */
-
-#define MAX_STATES 16 /* from slcompress.h */
-
-#define IPCP_VJMODE_OLD 1 /* "old" mode (option # = 0x0037) */
-#define IPCP_VJMODE_RFC1172 2 /* "old-rfc"mode (option # = 0x002d) */
-#define IPCP_VJMODE_RFC1332 3 /* "new-rfc"mode (option # = 0x002d, */
- /* maxslot and slot number compression) */
-
-#define IPCP_VJ_COMP 0x002d /* current value for VJ compression option*/
-#define IPCP_VJ_COMP_OLD 0x0037 /* "old" (i.e, broken) value for VJ */
- /* compression option*/
-
-typedef struct ipcp_options {
- bool neg_addr; /* Negotiate IP Address? */
- bool old_addrs; /* Use old (IP-Addresses) option? */
- bool req_addr; /* Ask peer to send IP address? */
- bool default_route; /* Assign default route through interface? */
- bool proxy_arp; /* Make proxy ARP entry for peer? */
- bool neg_vj; /* Van Jacobson Compression? */
- bool old_vj; /* use old (short) form of VJ option? */
- bool accept_local; /* accept peer's value for ouraddr */
- bool accept_remote; /* accept peer's value for hisaddr */
- bool req_dns1; /* Ask peer to send primary DNS address? */
- bool req_dns2; /* Ask peer to send secondary DNS address? */
- int vj_protocol; /* protocol value to use in VJ option */
- int maxslotindex; /* values for RFC1332 VJ compression neg. */
- bool cflag;
- u_int32_t ouraddr, hisaddr; /* Addresses in NETWORK BYTE ORDER */
- u_int32_t dnsaddr[2]; /* Primary and secondary MS DNS entries */
- u_int32_t winsaddr[2]; /* Primary and secondary MS WINS entries */
-} ipcp_options;
-
-extern fsm ipcp_fsm[];
-extern ipcp_options ipcp_wantoptions[];
-extern ipcp_options ipcp_gotoptions[];
-extern ipcp_options ipcp_allowoptions[];
-extern ipcp_options ipcp_hisoptions[];
-
-char *ip_ntoa __P((u_int32_t));
-
-extern struct protent ipcp_protent;
diff --git a/c/src/libnetworking/pppd/ipxcp.c b/c/src/libnetworking/pppd/ipxcp.c
deleted file mode 100644
index 4e408a00f9..0000000000
--- a/c/src/libnetworking/pppd/ipxcp.c
+++ /dev/null
@@ -1,1449 +0,0 @@
-/*
- * ipxcp.c - PPP IPX Control Protocol.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#ifdef IPX_CHANGE
-
-#define RCSID "$Id$"
-
-/*
- * TODO:
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-
-#include "pppd.h"
-#include "fsm.h"
-#include "ipxcp.h"
-#include "pathnames.h"
-#include "magic.h"
-
-static const char rcsid[] = RCSID;
-
-/* global vars */
-ipxcp_options ipxcp_wantoptions[NUM_PPP]; /* Options that we want to request */
-ipxcp_options ipxcp_gotoptions[NUM_PPP]; /* Options that peer ack'd */
-ipxcp_options ipxcp_allowoptions[NUM_PPP]; /* Options we allow peer to request */
-ipxcp_options ipxcp_hisoptions[NUM_PPP]; /* Options that we ack'd */
-
-#define wo (&ipxcp_wantoptions[0])
-#define ao (&ipxcp_allowoptions[0])
-#define go (&ipxcp_gotoptions[0])
-#define ho (&ipxcp_hisoptions[0])
-
-/*
- * Callbacks for fsm code. (CI = Configuration Information)
- */
-static void ipxcp_resetci __P((fsm *)); /* Reset our CI */
-static int ipxcp_cilen __P((fsm *)); /* Return length of our CI */
-static void ipxcp_addci __P((fsm *, u_char *, int *)); /* Add our CI */
-static int ipxcp_ackci __P((fsm *, u_char *, int)); /* Peer ack'd our CI */
-static int ipxcp_nakci __P((fsm *, u_char *, int)); /* Peer nak'd our CI */
-static int ipxcp_rejci __P((fsm *, u_char *, int)); /* Peer rej'd our CI */
-static int ipxcp_reqci __P((fsm *, u_char *, int *, int)); /* Rcv CI */
-static void ipxcp_up __P((fsm *)); /* We're UP */
-static void ipxcp_down __P((fsm *)); /* We're DOWN */
-static void ipxcp_finished __P((fsm *)); /* Don't need lower layer */
-
-fsm ipxcp_fsm[NUM_PPP]; /* IPXCP fsm structure */
-
-static fsm_callbacks ipxcp_callbacks = { /* IPXCP callback routines */
- ipxcp_resetci, /* Reset our Configuration Information */
- ipxcp_cilen, /* Length of our Configuration Information */
- ipxcp_addci, /* Add our Configuration Information */
- ipxcp_ackci, /* ACK our Configuration Information */
- ipxcp_nakci, /* NAK our Configuration Information */
- ipxcp_rejci, /* Reject our Configuration Information */
- ipxcp_reqci, /* Request peer's Configuration Information */
- ipxcp_up, /* Called when fsm reaches OPENED state */
- ipxcp_down, /* Called when fsm leaves OPENED state */
- NULL, /* Called when we want the lower layer up */
- ipxcp_finished, /* Called when we want the lower layer down */
- NULL, /* Called when Protocol-Reject received */
- NULL, /* Retransmission is necessary */
- NULL, /* Called to handle protocol-specific codes */
- "IPXCP" /* String name of protocol */
-};
-
-/*
- * Command-line options.
- */
-static int setipxnode __P((char **));
-static int setipxname __P((char **));
-
-static option_t ipxcp_option_list[] = {
- { "ipx", o_bool, &ipxcp_protent.enabled_flag,
- "Enable IPXCP (and IPX)", 1 },
- { "+ipx", o_bool, &ipxcp_protent.enabled_flag,
- "Enable IPXCP (and IPX)", 1 },
- { "noipx", o_bool, &ipxcp_protent.enabled_flag,
- "Disable IPXCP (and IPX)" },
- { "-ipx", o_bool, &ipxcp_protent.enabled_flag,
- "Disable IPXCP (and IPX)" } ,
- { "ipx-network", o_uint32, &ipxcp_wantoptions[0].our_network,
- "Set our IPX network number", 0, &ipxcp_wantoptions[0].neg_nn },
- { "ipxcp-accept-network", o_bool, &ipxcp_wantoptions[0].accept_network,
- "Accept peer IPX network number", 1,
- &ipxcp_allowoptions[0].accept_network },
- { "ipx-node", o_special, setipxnode,
- "Set IPX node number" },
- { "ipxcp-accept-local", o_bool, &ipxcp_wantoptions[0].accept_local,
- "Accept our IPX address", 1,
- &ipxcp_allowoptions[0].accept_local },
- { "ipxcp-accept-remote", o_bool, &ipxcp_wantoptions[0].accept_remote,
- "Accept peer's IPX address", 1,
- &ipxcp_allowoptions[0].accept_remote },
- { "ipx-routing", o_int, &ipxcp_wantoptions[0].router,
- "Set IPX routing proto number", 0,
- &ipxcp_wantoptions[0].neg_router },
- { "ipx-router-name", o_special, setipxname,
- "Set IPX router name" },
- { "ipxcp-restart", o_int, &ipxcp_fsm[0].timeouttime,
- "Set timeout for IPXCP" },
- { "ipxcp-max-terminate", o_int, &ipxcp_fsm[0].maxtermtransmits,
- "Set max #xmits for IPXCP term-reqs" },
- { "ipxcp-max-configure", o_int, &ipxcp_fsm[0].maxconfreqtransmits,
- "Set max #xmits for IPXCP conf-reqs" },
- { "ipxcp-max-failure", o_int, &ipxcp_fsm[0].maxnakloops,
- "Set max #conf-naks for IPXCP" },
- { NULL }
-};
-
-/*
- * Protocol entry points.
- */
-
-static void ipxcp_init __P((int));
-static void ipxcp_open __P((int));
-static void ipxcp_close __P((int, char *));
-static void ipxcp_lowerup __P((int));
-static void ipxcp_lowerdown __P((int));
-static void ipxcp_input __P((int, u_char *, int));
-static void ipxcp_protrej __P((int));
-static int ipxcp_printpkt __P((u_char *, int,
- void (*) __P((void *, char *, ...)), void *));
-
-struct protent ipxcp_protent = {
- PPP_IPXCP,
- ipxcp_init,
- ipxcp_input,
- ipxcp_protrej,
- ipxcp_lowerup,
- ipxcp_lowerdown,
- ipxcp_open,
- ipxcp_close,
- ipxcp_printpkt,
- NULL,
- 0,
- "IPXCP",
- "IPX",
- ipxcp_option_list,
- NULL,
- NULL,
- NULL
-};
-
-/*
- * Lengths of configuration options.
- */
-
-#define CILEN_VOID 2
-#define CILEN_COMPLETE 2 /* length of complete option */
-#define CILEN_NETN 6 /* network number length option */
-#define CILEN_NODEN 8 /* node number length option */
-#define CILEN_PROTOCOL 4 /* Minimum length of routing protocol */
-#define CILEN_NAME 3 /* Minimum length of router name */
-#define CILEN_COMPRESS 4 /* Minimum length of compression protocol */
-
-#define CODENAME(x) ((x) == CONFACK ? "ACK" : \
- (x) == CONFNAK ? "NAK" : "REJ")
-
-static int ipxcp_is_up;
-
-static char *ipx_ntoa __P((u_int32_t));
-
-/* Used in printing the node number */
-#define NODE(base) base[0], base[1], base[2], base[3], base[4], base[5]
-
-/* Used to generate the proper bit mask */
-#define BIT(num) (1 << (num))
-
-/*
- * Convert from internal to external notation
- */
-
-static short int
-to_external(internal)
-short int internal;
-{
- short int external;
-
- if (internal & BIT(IPX_NONE) )
- external = IPX_NONE;
- else
- external = RIP_SAP;
-
- return external;
-}
-
-/*
- * Make a string representation of a network IP address.
- */
-
-static char *
-ipx_ntoa(ipxaddr)
-u_int32_t ipxaddr;
-{
- static char b[64];
- slprintf(b, sizeof(b), "%x", ipxaddr);
- return b;
-}
-
-
-static u_char *
-setipxnodevalue(src,dst)
-u_char *src, *dst;
-{
- int indx;
- int item;
-
- for (;;) {
- if (!isxdigit (*src))
- break;
-
- for (indx = 0; indx < 5; ++indx) {
- dst[indx] <<= 4;
- dst[indx] |= (dst[indx + 1] >> 4) & 0x0F;
- }
-
- item = toupper (*src) - '0';
- if (item > 9)
- item -= 7;
-
- dst[5] = (dst[5] << 4) | item;
- ++src;
- }
- return src;
-}
-
-static int
-setipxnode(argv)
- char **argv;
-{
- char *end;
-
- memset (&ipxcp_wantoptions[0].our_node[0], 0, 6);
- memset (&ipxcp_wantoptions[0].his_node[0], 0, 6);
-
- end = setipxnodevalue (*argv, &ipxcp_wantoptions[0].our_node[0]);
- if (*end == ':')
- end = setipxnodevalue (++end, &ipxcp_wantoptions[0].his_node[0]);
-
- if (*end == '\0') {
- ipxcp_wantoptions[0].neg_node = 1;
- return 1;
- }
-
- option_error("invalid parameter '%s' for ipx-node option", *argv);
- return 0;
-}
-
-static int
-setipxname (argv)
- char **argv;
-{
- char *dest = ipxcp_wantoptions[0].name;
- char *src = *argv;
- int count;
- char ch;
-
- ipxcp_wantoptions[0].neg_name = 1;
- ipxcp_allowoptions[0].neg_name = 1;
- memset (dest, '\0', sizeof (ipxcp_wantoptions[0].name));
-
- count = 0;
- while (*src) {
- ch = *src++;
- if (! isalnum (ch) && ch != '_') {
- option_error("IPX router name must be alphanumeric or _");
- return 0;
- }
-
- if (count >= sizeof (ipxcp_wantoptions[0].name)) {
- option_error("IPX router name is limited to %d characters",
- sizeof (ipxcp_wantoptions[0].name) - 1);
- return 0;
- }
-
- dest[count++] = toupper (ch);
- }
-
- return 1;
-}
-
-/*
- * ipxcp_init - Initialize IPXCP.
- */
-static void
-ipxcp_init(unit)
- int unit;
-{
- fsm *f = &ipxcp_fsm[unit];
-
- f->unit = unit;
- f->protocol = PPP_IPXCP;
- f->callbacks = &ipxcp_callbacks;
- fsm_init(&ipxcp_fsm[unit]);
-
- memset (wo->name, 0, sizeof (wo->name));
- memset (wo->our_node, 0, sizeof (wo->our_node));
- memset (wo->his_node, 0, sizeof (wo->his_node));
-
- wo->neg_nn = 1;
- wo->neg_complete = 1;
- wo->network = 0;
-
- ao->neg_node = 1;
- ao->neg_nn = 1;
- ao->neg_name = 1;
- ao->neg_complete = 1;
- ao->neg_router = 1;
-
- ao->accept_local = 0;
- ao->accept_remote = 0;
- ao->accept_network = 0;
-
- wo->tried_rip = 0;
- wo->tried_nlsp = 0;
-}
-
-/*
- * Copy the node number
- */
-
-static void
-copy_node (src, dst)
-u_char *src, *dst;
-{
- memcpy (dst, src, sizeof (ipxcp_wantoptions[0].our_node));
-}
-
-/*
- * Compare node numbers
- */
-
-static int
-compare_node (src, dst)
-u_char *src, *dst;
-{
- return memcmp (dst, src, sizeof (ipxcp_wantoptions[0].our_node)) == 0;
-}
-
-/*
- * Is the node number zero?
- */
-
-static int
-zero_node (node)
-u_char *node;
-{
- int indx;
- for (indx = 0; indx < sizeof (ipxcp_wantoptions[0].our_node); ++indx)
- if (node [indx] != 0)
- return 0;
- return 1;
-}
-
-/*
- * Increment the node number
- */
-
-static void
-inc_node (node)
-u_char *node;
-{
- u_char *outp;
- u_int32_t magic_num;
-
- outp = node;
- magic_num = magic();
- *outp++ = '\0';
- *outp++ = '\0';
- PUTLONG (magic_num, outp);
-}
-
-/*
- * ipxcp_open - IPXCP is allowed to come up.
- */
-static void
-ipxcp_open(unit)
- int unit;
-{
- fsm_open(&ipxcp_fsm[unit]);
-}
-
-/*
- * ipxcp_close - Take IPXCP down.
- */
-static void
-ipxcp_close(unit, reason)
- int unit;
- char *reason;
-{
- fsm_close(&ipxcp_fsm[unit], reason);
-}
-
-
-/*
- * ipxcp_lowerup - The lower layer is up.
- */
-static void
-ipxcp_lowerup(unit)
- int unit;
-{
- fsm_lowerup(&ipxcp_fsm[unit]);
-}
-
-
-/*
- * ipxcp_lowerdown - The lower layer is down.
- */
-static void
-ipxcp_lowerdown(unit)
- int unit;
-{
- fsm_lowerdown(&ipxcp_fsm[unit]);
-}
-
-
-/*
- * ipxcp_input - Input IPXCP packet.
- */
-static void
-ipxcp_input(unit, p, len)
- int unit;
- u_char *p;
- int len;
-{
- fsm_input(&ipxcp_fsm[unit], p, len);
-}
-
-
-/*
- * ipxcp_protrej - A Protocol-Reject was received for IPXCP.
- *
- * Pretend the lower layer went down, so we shut up.
- */
-static void
-ipxcp_protrej(unit)
- int unit;
-{
- fsm_lowerdown(&ipxcp_fsm[unit]);
-}
-
-
-/*
- * ipxcp_resetci - Reset our CI.
- */
-static void
-ipxcp_resetci(f)
- fsm *f;
-{
- wo->req_node = wo->neg_node && ao->neg_node;
- wo->req_nn = wo->neg_nn && ao->neg_nn;
-
- if (wo->our_network == 0) {
- wo->neg_node = 1;
- ao->accept_network = 1;
- }
-/*
- * If our node number is zero then change it.
- */
- if (zero_node (wo->our_node)) {
- inc_node (wo->our_node);
- ao->accept_local = 1;
- wo->neg_node = 1;
- }
-/*
- * If his node number is zero then change it.
- */
- if (zero_node (wo->his_node)) {
- inc_node (wo->his_node);
- ao->accept_remote = 1;
- }
-/*
- * If no routing agent was specified then we do RIP/SAP according to the
- * RFC documents. If you have specified something then OK. Otherwise, we
- * do RIP/SAP.
- */
- if (ao->router == 0) {
- ao->router |= BIT(RIP_SAP);
- wo->router |= BIT(RIP_SAP);
- }
-
- /* Always specify a routing protocol unless it was REJected. */
- wo->neg_router = 1;
-/*
- * Start with these default values
- */
- *go = *wo;
-}
-
-/*
- * ipxcp_cilen - Return length of our CI.
- */
-
-static int
-ipxcp_cilen(f)
- fsm *f;
-{
- int len;
-
- len = go->neg_nn ? CILEN_NETN : 0;
- len += go->neg_node ? CILEN_NODEN : 0;
- len += go->neg_name ? CILEN_NAME + strlen (go->name) - 1 : 0;
-
- /* RFC says that defaults should not be included. */
- if (go->neg_router && to_external(go->router) != RIP_SAP)
- len += CILEN_PROTOCOL;
-
- return (len);
-}
-
-
-/*
- * ipxcp_addci - Add our desired CIs to a packet.
- */
-static void
-ipxcp_addci(f, ucp, lenp)
- fsm *f;
- u_char *ucp;
- int *lenp;
-{
-/*
- * Add the options to the record.
- */
- if (go->neg_nn) {
- PUTCHAR (IPX_NETWORK_NUMBER, ucp);
- PUTCHAR (CILEN_NETN, ucp);
- PUTLONG (go->our_network, ucp);
- }
-
- if (go->neg_node) {
- int indx;
- PUTCHAR (IPX_NODE_NUMBER, ucp);
- PUTCHAR (CILEN_NODEN, ucp);
- for (indx = 0; indx < sizeof (go->our_node); ++indx)
- PUTCHAR (go->our_node[indx], ucp);
- }
-
- if (go->neg_name) {
- int cilen = strlen (go->name);
- int indx;
- PUTCHAR (IPX_ROUTER_NAME, ucp);
- PUTCHAR (CILEN_NAME + cilen - 1, ucp);
- for (indx = 0; indx < cilen; ++indx)
- PUTCHAR (go->name [indx], ucp);
- }
-
- if (go->neg_router) {
- short external = to_external (go->router);
- if (external != RIP_SAP) {
- PUTCHAR (IPX_ROUTER_PROTOCOL, ucp);
- PUTCHAR (CILEN_PROTOCOL, ucp);
- PUTSHORT (external, ucp);
- }
- }
-}
-
-/*
- * ipxcp_ackci - Ack our CIs.
- *
- * Returns:
- * 0 - Ack was bad.
- * 1 - Ack was good.
- */
-static int
-ipxcp_ackci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- u_short cilen, citype, cishort;
- u_char cichar;
- u_int32_t cilong;
-
-#define ACKCIVOID(opt, neg) \
- if (neg) { \
- if ((len -= CILEN_VOID) < 0) \
- break; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_VOID || \
- citype != opt) \
- break; \
- }
-
-#define ACKCICOMPLETE(opt,neg) ACKCIVOID(opt, neg)
-
-#define ACKCICHARS(opt, neg, val, cnt) \
- if (neg) { \
- int indx, count = cnt; \
- len -= (count + 2); \
- if (len < 0) \
- break; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != (count + 2) || \
- citype != opt) \
- break; \
- for (indx = 0; indx < count; ++indx) {\
- GETCHAR(cichar, p); \
- if (cichar != ((u_char *) &val)[indx]) \
- break; \
- }\
- if (indx != count) \
- break; \
- }
-
-#define ACKCINODE(opt,neg,val) ACKCICHARS(opt,neg,val,sizeof(val))
-#define ACKCINAME(opt,neg,val) ACKCICHARS(opt,neg,val,strlen(val))
-
-#define ACKCINETWORK(opt, neg, val) \
- if (neg) { \
- if ((len -= CILEN_NETN) < 0) \
- break; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_NETN || \
- citype != opt) \
- break; \
- GETLONG(cilong, p); \
- if (cilong != val) \
- break; \
- }
-
-#define ACKCIPROTO(opt, neg, val) \
- if (neg) { \
- if (len < 2) \
- break; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_PROTOCOL || citype != opt) \
- break; \
- len -= cilen; \
- if (len < 0) \
- break; \
- GETSHORT(cishort, p); \
- if (cishort != to_external (val) || cishort == RIP_SAP) \
- break; \
- }
-/*
- * Process the ACK frame in the order in which the frame was assembled
- */
- do {
- ACKCINETWORK (IPX_NETWORK_NUMBER, go->neg_nn, go->our_network);
- ACKCINODE (IPX_NODE_NUMBER, go->neg_node, go->our_node);
- ACKCINAME (IPX_ROUTER_NAME, go->neg_name, go->name);
- if (len > 0)
- ACKCIPROTO (IPX_ROUTER_PROTOCOL, go->neg_router, go->router);
-/*
- * This is the end of the record.
- */
- if (len == 0)
- return (1);
- } while (0);
-/*
- * The frame is invalid
- */
- IPXCPDEBUG(("ipxcp_ackci: received bad Ack!"));
- return (0);
-}
-
-/*
- * ipxcp_nakci - Peer has sent a NAK for some of our CIs.
- * This should not modify any state if the Nak is bad
- * or if IPXCP is in the OPENED state.
- *
- * Returns:
- * 0 - Nak was bad.
- * 1 - Nak was good.
- */
-
-static int
-ipxcp_nakci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- u_char citype, cilen, *next;
- u_short s;
- u_int32_t l;
- ipxcp_options no; /* options we've seen Naks for */
- ipxcp_options try; /* options to request next time */
-
- BZERO(&no, sizeof(no));
- try = *go;
-
- while (len > CILEN_VOID) {
- GETCHAR (citype, p);
- GETCHAR (cilen, p);
- len -= cilen;
- if (len < 0)
- goto bad;
- next = &p [cilen - CILEN_VOID];
-
- switch (citype) {
- case IPX_NETWORK_NUMBER:
- if (!go->neg_nn || no.neg_nn || (cilen != CILEN_NETN))
- goto bad;
- no.neg_nn = 1;
-
- GETLONG(l, p);
- if (l && ao->accept_network)
- try.our_network = l;
- break;
-
- case IPX_NODE_NUMBER:
- if (!go->neg_node || no.neg_node || (cilen != CILEN_NODEN))
- goto bad;
- no.neg_node = 1;
-
- if (!zero_node (p) && ao->accept_local &&
- ! compare_node (p, ho->his_node))
- copy_node (p, try.our_node);
- break;
-
- /* This has never been sent. Ignore the NAK frame */
- case IPX_COMPRESSION_PROTOCOL:
- goto bad;
-
- case IPX_ROUTER_PROTOCOL:
- if (!go->neg_router || (cilen < CILEN_PROTOCOL))
- goto bad;
-
- GETSHORT (s, p);
- if (s > 15) /* This is just bad, but ignore for now. */
- break;
-
- s = BIT(s);
- if (no.router & s) /* duplicate NAKs are always bad */
- goto bad;
-
- if (no.router == 0) /* Reset on first NAK only */
- try.router = 0;
-
- no.router |= s;
- try.router |= s;
- try.neg_router = 1;
- break;
-
- /* These, according to the RFC, must never be NAKed. */
- case IPX_ROUTER_NAME:
- case IPX_COMPLETE:
- goto bad;
-
- /* These are for options which we have not seen. */
- default:
- break;
- }
- p = next;
- }
-
- /*
- * Do not permit the peer to force a router protocol which we do not
- * support. However, default to the condition that will accept "NONE".
- */
- try.router &= (ao->router | BIT(IPX_NONE));
- if (try.router == 0 && ao->router != 0)
- try.router = BIT(IPX_NONE);
-
- if (try.router != 0)
- try.neg_router = 1;
-
- /*
- * OK, the Nak is good. Now we can update state.
- * If there are any options left, we ignore them.
- */
- if (f->state != OPENED)
- *go = try;
-
- return 1;
-
-bad:
- IPXCPDEBUG(("ipxcp_nakci: received bad Nak!"));
- return 0;
-}
-
-/*
- * ipxcp_rejci - Reject some of our CIs.
- */
-static int
-ipxcp_rejci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- u_short cilen, citype, cishort;
- u_char cichar;
- u_int32_t cilong;
- ipxcp_options try; /* options to request next time */
-
-#define REJCINETWORK(opt, neg, val) \
- if (neg && p[0] == opt) { \
- if ((len -= CILEN_NETN) < 0) \
- break; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_NETN || \
- citype != opt) \
- break; \
- GETLONG(cilong, p); \
- if (cilong != val) \
- break; \
- neg = 0; \
- }
-
-#define REJCICHARS(opt, neg, val, cnt) \
- if (neg && p[0] == opt) { \
- int indx, count = cnt; \
- len -= (count + 2); \
- if (len < 0) \
- break; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != (count + 2) || \
- citype != opt) \
- break; \
- for (indx = 0; indx < count; ++indx) {\
- GETCHAR(cichar, p); \
- if (cichar != ((u_char *) &val)[indx]) \
- break; \
- }\
- if (indx != count) \
- break; \
- neg = 0; \
- }
-
-#define REJCINODE(opt,neg,val) REJCICHARS(opt,neg,val,sizeof(val))
-#define REJCINAME(opt,neg,val) REJCICHARS(opt,neg,val,strlen(val))
-
-#define REJCIVOID(opt, neg) \
- if (neg && p[0] == opt) { \
- if ((len -= CILEN_VOID) < 0) \
- break; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_VOID || citype != opt) \
- break; \
- neg = 0; \
- }
-
-/* a reject for RIP/SAP is invalid since we don't send it and you can't
- reject something which is not sent. (You can NAK, but you can't REJ.) */
-#define REJCIPROTO(opt, neg, val, bit) \
- if (neg && p[0] == opt) { \
- if ((len -= CILEN_PROTOCOL) < 0) \
- break; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_PROTOCOL) \
- break; \
- GETSHORT(cishort, p); \
- if (cishort != to_external (val) || cishort == RIP_SAP) \
- break; \
- neg = 0; \
- }
-/*
- * Any Rejected CIs must be in exactly the same order that we sent.
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
- try = *go;
-
- do {
- REJCINETWORK (IPX_NETWORK_NUMBER, try.neg_nn, try.our_network);
- REJCINODE (IPX_NODE_NUMBER, try.neg_node, try.our_node);
- REJCINAME (IPX_ROUTER_NAME, try.neg_name, try.name);
- REJCIPROTO (IPX_ROUTER_PROTOCOL, try.neg_router, try.router, 0);
-/*
- * This is the end of the record.
- */
- if (len == 0) {
- if (f->state != OPENED)
- *go = try;
- return (1);
- }
- } while (0);
-/*
- * The frame is invalid at this point.
- */
- IPXCPDEBUG(("ipxcp_rejci: received bad Reject!"));
- return 0;
-}
-
-/*
- * ipxcp_reqci - Check the peer's requested CIs and send appropriate response.
- *
- * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified
- * appropriately. If reject_if_disagree is non-zero, doesn't return
- * CONFNAK; returns CONFREJ if it can't return CONFACK.
- */
-static int
-ipxcp_reqci(f, inp, len, reject_if_disagree)
- fsm *f;
- u_char *inp; /* Requested CIs */
- int *len; /* Length of requested CIs */
- int reject_if_disagree;
-{
- u_char *cip, *next; /* Pointer to current and next CIs */
- u_short cilen, citype; /* Parsed len, type */
- u_short cishort; /* Parsed short value */
- u_int32_t cinetwork; /* Parsed address values */
- int rc = CONFACK; /* Final packet return code */
- int orc; /* Individual option return code */
- u_char *p; /* Pointer to next char to parse */
- u_char *ucp = inp; /* Pointer to current output char */
- int l = *len; /* Length left */
-
- /*
- * Reset all his options.
- */
- BZERO(ho, sizeof(*ho));
-
- /*
- * Process all his options.
- */
- next = inp;
- while (l) {
- orc = CONFACK; /* Assume success */
- cip = p = next; /* Remember begining of CI */
- if (l < 2 || /* Not enough data for CI header or */
- p[1] < 2 || /* CI length too small or */
- p[1] > l) { /* CI length too big? */
- IPXCPDEBUG(("ipxcp_reqci: bad CI length!"));
- orc = CONFREJ; /* Reject bad CI */
- cilen = l; /* Reject till end of packet */
- l = 0; /* Don't loop again */
- goto endswitch;
- }
- GETCHAR(citype, p); /* Parse CI type */
- GETCHAR(cilen, p); /* Parse CI length */
- l -= cilen; /* Adjust remaining length */
- next += cilen; /* Step to next CI */
-
- switch (citype) { /* Check CI type */
-/*
- * The network number must match. Choose the larger of the two.
- */
- case IPX_NETWORK_NUMBER:
- /* if we wont negotiate the network number or the length is wrong
- then reject the option */
- if ( !ao->neg_nn || cilen != CILEN_NETN ) {
- orc = CONFREJ;
- break;
- }
- GETLONG(cinetwork, p);
-
- /* If the network numbers match then acknowledge them. */
- if (cinetwork != 0) {
- ho->his_network = cinetwork;
- ho->neg_nn = 1;
- if (wo->our_network == cinetwork)
- break;
-/*
- * If the network number is not given or we don't accept their change or
- * the network number is too small then NAK it.
- */
- if (! ao->accept_network || cinetwork < wo->our_network) {
- DECPTR (sizeof (u_int32_t), p);
- PUTLONG (wo->our_network, p);
- orc = CONFNAK;
- }
- break;
- }
-/*
- * The peer sent '0' for the network. Give it ours if we have one.
- */
- if (go->our_network != 0) {
- DECPTR (sizeof (u_int32_t), p);
- PUTLONG (wo->our_network, p);
- orc = CONFNAK;
-/*
- * We don't have one. Reject the value.
- */
- } else
- orc = CONFREJ;
-
- break;
-/*
- * The node number is required
- */
- case IPX_NODE_NUMBER:
- /* if we wont negotiate the node number or the length is wrong
- then reject the option */
- if ( cilen != CILEN_NODEN ) {
- orc = CONFREJ;
- break;
- }
-
- copy_node (p, ho->his_node);
- ho->neg_node = 1;
-/*
- * If the remote does not have a number and we do then NAK it with the value
- * which we have for it. (We never have a default value of zero.)
- */
- if (zero_node (ho->his_node)) {
- orc = CONFNAK;
- copy_node (wo->his_node, p);
- INCPTR (sizeof (wo->his_node), p);
- break;
- }
-/*
- * If you have given me the expected network node number then I'll accept
- * it now.
- */
- if (compare_node (wo->his_node, ho->his_node)) {
- orc = CONFACK;
- ho->neg_node = 1;
- INCPTR (sizeof (wo->his_node), p);
- break;
- }
-/*
- * If his node number is the same as ours then ask him to try the next
- * value.
- */
- if (compare_node (ho->his_node, go->our_node)) {
- inc_node (ho->his_node);
- orc = CONFNAK;
- copy_node (ho->his_node, p);
- INCPTR (sizeof (wo->his_node), p);
- break;
- }
-/*
- * If we don't accept a new value then NAK it.
- */
- if (! ao->accept_remote) {
- copy_node (wo->his_node, p);
- INCPTR (sizeof (wo->his_node), p);
- orc = CONFNAK;
- break;
- }
- orc = CONFACK;
- ho->neg_node = 1;
- INCPTR (sizeof (wo->his_node), p);
- break;
-/*
- * Compression is not desired at this time. It is always rejected.
- */
- case IPX_COMPRESSION_PROTOCOL:
- orc = CONFREJ;
- break;
-/*
- * The routing protocol is a bitmask of various types. Any combination
- * of the values RIP_SAP and NLSP are permissible. 'IPX_NONE' for no
- * routing protocol must be specified only once.
- */
- case IPX_ROUTER_PROTOCOL:
- if ( !ao->neg_router || cilen < CILEN_PROTOCOL ) {
- orc = CONFREJ;
- break;
- }
-
- GETSHORT (cishort, p);
-
- if (wo->neg_router == 0) {
- wo->neg_router = 1;
- wo->router = BIT(IPX_NONE);
- }
-
- if ((cishort == IPX_NONE && ho->router != 0) ||
- (ho->router & BIT(IPX_NONE))) {
- orc = CONFREJ;
- break;
- }
-
- cishort = BIT(cishort);
- if (ho->router & cishort) {
- orc = CONFREJ;
- break;
- }
-
- ho->router |= cishort;
- ho->neg_router = 1;
-
- /* Finally do not allow a router protocol which we do not
- support. */
-
- if ((cishort & (ao->router | BIT(IPX_NONE))) == 0) {
- int protocol;
-
- if (cishort == BIT(NLSP) &&
- (ao->router & BIT(RIP_SAP)) &&
- !wo->tried_rip) {
- protocol = RIP_SAP;
- wo->tried_rip = 1;
- } else
- protocol = IPX_NONE;
-
- DECPTR (sizeof (u_int16_t), p);
- PUTSHORT (protocol, p);
- orc = CONFNAK;
- }
- break;
-/*
- * The router name is advisorary. Just accept it if it is not too large.
- */
- case IPX_ROUTER_NAME:
- if (cilen >= CILEN_NAME) {
- int name_size = cilen - CILEN_NAME;
- if (name_size > sizeof (ho->name))
- name_size = sizeof (ho->name) - 1;
- memset (ho->name, 0, sizeof (ho->name));
- memcpy (ho->name, p, name_size);
- ho->name [name_size] = '\0';
- ho->neg_name = 1;
- orc = CONFACK;
- break;
- }
- orc = CONFREJ;
- break;
-/*
- * This is advisorary.
- */
- case IPX_COMPLETE:
- if (cilen != CILEN_COMPLETE)
- orc = CONFREJ;
- else {
- ho->neg_complete = 1;
- orc = CONFACK;
- }
- break;
-/*
- * All other entries are not known at this time.
- */
- default:
- orc = CONFREJ;
- break;
- }
-endswitch:
- if (orc == CONFACK && /* Good CI */
- rc != CONFACK) /* but prior CI wasnt? */
- continue; /* Don't send this one */
-
- if (orc == CONFNAK) { /* Nak this CI? */
- if (reject_if_disagree) /* Getting fed up with sending NAKs? */
- orc = CONFREJ; /* Get tough if so */
- if (rc == CONFREJ) /* Rejecting prior CI? */
- continue; /* Don't send this one */
- if (rc == CONFACK) { /* Ack'd all prior CIs? */
- rc = CONFNAK; /* Not anymore... */
- ucp = inp; /* Backup */
- }
- }
-
- if (orc == CONFREJ && /* Reject this CI */
- rc != CONFREJ) { /* but no prior ones? */
- rc = CONFREJ;
- ucp = inp; /* Backup */
- }
-
- /* Need to move CI? */
- if (ucp != cip)
- BCOPY(cip, ucp, cilen); /* Move it */
-
- /* Update output pointer */
- INCPTR(cilen, ucp);
- }
-
- /*
- * If we aren't rejecting this packet, and we want to negotiate
- * their address, and they didn't send their address, then we
- * send a NAK with a IPX_NODE_NUMBER option appended. We assume the
- * input buffer is long enough that we can append the extra
- * option safely.
- */
-
- if (rc != CONFREJ && !ho->neg_node &&
- wo->req_nn && !reject_if_disagree) {
- if (rc == CONFACK) {
- rc = CONFNAK;
- wo->req_nn = 0; /* don't ask again */
- ucp = inp; /* reset pointer */
- }
-
- if (zero_node (wo->his_node))
- inc_node (wo->his_node);
-
- PUTCHAR (IPX_NODE_NUMBER, ucp);
- PUTCHAR (CILEN_NODEN, ucp);
- copy_node (wo->his_node, ucp);
- INCPTR (sizeof (wo->his_node), ucp);
- }
-
- *len = ucp - inp; /* Compute output length */
- IPXCPDEBUG(("ipxcp: returning Configure-%s", CODENAME(rc)));
- return (rc); /* Return final code */
-}
-
-/*
- * ipxcp_up - IPXCP has come UP.
- *
- * Configure the IP network interface appropriately and bring it up.
- */
-
-static void
-ipxcp_up(f)
- fsm *f;
-{
- int unit = f->unit;
-
- IPXCPDEBUG(("ipxcp: up"));
-
- /* The default router protocol is RIP/SAP. */
- if (ho->router == 0)
- ho->router = BIT(RIP_SAP);
-
- if (go->router == 0)
- go->router = BIT(RIP_SAP);
-
- /* Fetch the network number */
- if (!ho->neg_nn)
- ho->his_network = wo->his_network;
-
- if (!ho->neg_node)
- copy_node (wo->his_node, ho->his_node);
-
- if (!wo->neg_node && !go->neg_node)
- copy_node (wo->our_node, go->our_node);
-
- if (zero_node (go->our_node)) {
- static char errmsg[] = "Could not determine local IPX node address";
- if (debug)
- error(errmsg);
- ipxcp_close(f->unit, errmsg);
- return;
- }
-
- go->network = go->our_network;
- if (ho->his_network != 0 && ho->his_network > go->network)
- go->network = ho->his_network;
-
- if (go->network == 0) {
- static char errmsg[] = "Can not determine network number";
- if (debug)
- error(errmsg);
- ipxcp_close (unit, errmsg);
- return;
- }
-
- /* bring the interface up */
- if (!sifup(unit)) {
- if (debug)
- warn("sifup failed (IPX)");
- ipxcp_close(unit, "Interface configuration failed");
- return;
- }
- ipxcp_is_up = 1;
-
- /* set the network number for IPX */
- if (!sipxfaddr(unit, go->network, go->our_node)) {
- if (debug)
- warn("sipxfaddr failed");
- ipxcp_close(unit, "Interface configuration failed");
- return;
- }
-
- np_up(f->unit, PPP_IPX);
-}
-
-/*
- * ipxcp_down - IPXCP has gone DOWN.
- *
- * Take the IP network interface down, clear its addresses
- * and delete routes through it.
- */
-
-static void
-ipxcp_down(f)
- fsm *f;
-{
- IPXCPDEBUG(("ipxcp: down"));
-
- if (!ipxcp_is_up)
- return;
- ipxcp_is_up = 0;
- np_down(f->unit, PPP_IPX);
- cipxfaddr(f->unit);
- sifnpmode(f->unit, PPP_IPX, NPMODE_DROP);
- sifdown(f->unit);
-}
-
-
-/*
- * ipxcp_finished - possibly shut down the lower layers.
- */
-static void
-ipxcp_finished(f)
- fsm *f;
-{
- np_finished(f->unit, PPP_IPX);
-}
-
-
-/*
- * ipxcp_printpkt - print the contents of an IPXCP packet.
- */
-static char *ipxcp_codenames[] = {
- "ConfReq", "ConfAck", "ConfNak", "ConfRej",
- "TermReq", "TermAck", "CodeRej"
-};
-
-static int
-ipxcp_printpkt(p, plen, printer, arg)
- u_char *p;
- int plen;
- void (*printer) __P((void *, char *, ...));
- void *arg;
-{
- int code, id, len, olen;
- u_char *pstart, *optend;
- u_short cishort;
- u_int32_t cilong;
-
- if (plen < HEADERLEN)
- return 0;
- pstart = p;
- GETCHAR(code, p);
- GETCHAR(id, p);
- GETSHORT(len, p);
- if (len < HEADERLEN || len > plen)
- return 0;
-
- if (code >= 1 && code <= sizeof(ipxcp_codenames) / sizeof(char *))
- printer(arg, " %s", ipxcp_codenames[code-1]);
- else
- printer(arg, " code=0x%x", code);
- printer(arg, " id=0x%x", id);
- len -= HEADERLEN;
- switch (code) {
- case CONFREQ:
- case CONFACK:
- case CONFNAK:
- case CONFREJ:
- /* print option list */
- while (len >= 2) {
- GETCHAR(code, p);
- GETCHAR(olen, p);
- p -= 2;
- if (olen < CILEN_VOID || olen > len) {
- break;
- }
- printer(arg, " <");
- len -= olen;
- optend = p + olen;
- switch (code) {
- case IPX_NETWORK_NUMBER:
- if (olen == CILEN_NETN) {
- p += 2;
- GETLONG(cilong, p);
- printer (arg, "network %s", ipx_ntoa (cilong));
- }
- break;
- case IPX_NODE_NUMBER:
- if (olen == CILEN_NODEN) {
- p += 2;
- printer (arg, "node ");
- while (p < optend) {
- GETCHAR(code, p);
- printer(arg, "%.2x", (int) (unsigned int) (unsigned char) code);
- }
- }
- break;
- case IPX_COMPRESSION_PROTOCOL:
- if (olen == CILEN_COMPRESS) {
- p += 2;
- GETSHORT (cishort, p);
- printer (arg, "compression %d", (int) cishort);
- }
- break;
- case IPX_ROUTER_PROTOCOL:
- if (olen == CILEN_PROTOCOL) {
- p += 2;
- GETSHORT (cishort, p);
- printer (arg, "router proto %d", (int) cishort);
- }
- break;
- case IPX_ROUTER_NAME:
- if (olen >= CILEN_NAME) {
- p += 2;
- printer (arg, "router name \"");
- while (p < optend) {
- GETCHAR(code, p);
- if (code >= 0x20 && code <= 0x7E)
- printer (arg, "%c", (int) (unsigned int) (unsigned char) code);
- else
- printer (arg, " \\%.2x", (int) (unsigned int) (unsigned char) code);
- }
- printer (arg, "\"");
- }
- break;
- case IPX_COMPLETE:
- if (olen == CILEN_COMPLETE) {
- p += 2;
- printer (arg, "complete");
- }
- break;
- default:
- break;
- }
-
- while (p < optend) {
- GETCHAR(code, p);
- printer(arg, " %.2x", (int) (unsigned int) (unsigned char) code);
- }
- printer(arg, ">");
- }
- break;
-
- case TERMACK:
- case TERMREQ:
- if (len > 0 && *p >= ' ' && *p < 0x7f) {
- printer(arg, " ");
- print_string(p, len, printer, arg);
- p += len;
- len = 0;
- }
- break;
- }
-
- /* print the rest of the bytes in the packet */
- for (; len > 0; --len) {
- GETCHAR(code, p);
- printer(arg, " %.2x", (int) (unsigned int) (unsigned char) code);
- }
-
- return p - pstart;
-}
-#endif /* ifdef IPX_CHANGE */
diff --git a/c/src/libnetworking/pppd/ipxcp.h b/c/src/libnetworking/pppd/ipxcp.h
deleted file mode 100644
index 47f680d70c..0000000000
--- a/c/src/libnetworking/pppd/ipxcp.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * ipxcp.h - IPX Control Protocol definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id$
- */
-
-/*
- * Options.
- */
-#define IPX_NETWORK_NUMBER 1 /* IPX Network Number */
-#define IPX_NODE_NUMBER 2
-#define IPX_COMPRESSION_PROTOCOL 3
-#define IPX_ROUTER_PROTOCOL 4
-#define IPX_ROUTER_NAME 5
-#define IPX_COMPLETE 6
-
-/* Values for the router protocol */
-#define IPX_NONE 0
-#define RIP_SAP 2
-#define NLSP 4
-
-typedef struct ipxcp_options {
- bool neg_node; /* Negotiate IPX node number? */
- bool req_node; /* Ask peer to send IPX node number? */
-
- bool neg_nn; /* Negotiate IPX network number? */
- bool req_nn; /* Ask peer to send IPX network number */
-
- bool neg_name; /* Negotiate IPX router name */
- bool neg_complete; /* Negotiate completion */
- bool neg_router; /* Negotiate IPX router number */
-
- bool accept_local; /* accept peer's value for ournode */
- bool accept_remote; /* accept peer's value for hisnode */
- bool accept_network; /* accept network number */
-
- bool tried_nlsp; /* I have suggested NLSP already */
- bool tried_rip; /* I have suggested RIP/SAP already */
-
- u_int32_t his_network; /* base network number */
- u_int32_t our_network; /* our value for network number */
- u_int32_t network; /* the final network number */
-
- u_char his_node[6]; /* peer's node number */
- u_char our_node[6]; /* our node number */
- u_char name [48]; /* name of the router */
- int router; /* routing protocol */
-} ipxcp_options;
-
-extern fsm ipxcp_fsm[];
-extern ipxcp_options ipxcp_wantoptions[];
-extern ipxcp_options ipxcp_gotoptions[];
-extern ipxcp_options ipxcp_allowoptions[];
-extern ipxcp_options ipxcp_hisoptions[];
-
-extern struct protent ipxcp_protent;
diff --git a/c/src/libnetworking/pppd/lcp.c b/c/src/libnetworking/pppd/lcp.c
deleted file mode 100644
index 4308c86026..0000000000
--- a/c/src/libnetworking/pppd/lcp.c
+++ /dev/null
@@ -1,1953 +0,0 @@
-/*
- * lcp.c - PPP Link Control Protocol.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#define RCSID "$Id$";
-
-/*
- * TODO:
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "pppd.h"
-#include "fsm.h"
-#include "lcp.h"
-#include "chap.h"
-#include "magic.h"
-
-static const char rcsid[] = RCSID;
-
-/*
- * LCP-related command-line options.
- */
-static int lcp_echo_interval = 0; /* Interval between LCP echo-requests */
-static int lcp_echo_fails = 0; /* Tolerance to unanswered echo-requests */
-static bool lax_recv = 0; /* accept control chars in asyncmap */
-
-static int setescape __P((char **));
-
-static option_t lcp_option_list[] = {
- /* LCP options */
- { "noaccomp", o_bool, &lcp_wantoptions[0].neg_accompression,
- "Disable address/control compression",
- OPT_A2COPY, &lcp_allowoptions[0].neg_accompression },
- { "-ac", o_bool, &lcp_wantoptions[0].neg_accompression,
- "Disable address/control compression",
- OPT_A2COPY, &lcp_allowoptions[0].neg_accompression },
- { "default-asyncmap", o_bool, &lcp_wantoptions[0].neg_asyncmap,
- "Disable asyncmap negotiation",
- OPT_A2COPY, &lcp_allowoptions[0].neg_asyncmap },
- { "-am", o_bool, &lcp_wantoptions[0].neg_asyncmap,
- "Disable asyncmap negotiation",
- OPT_A2COPY, &lcp_allowoptions[0].neg_asyncmap },
- { "asyncmap", o_uint32, &lcp_wantoptions[0].asyncmap,
- "Set asyncmap (for received packets)",
- OPT_OR, &lcp_wantoptions[0].neg_asyncmap },
- { "-as", o_uint32, &lcp_wantoptions[0].asyncmap,
- "Set asyncmap (for received packets)",
- OPT_OR, &lcp_wantoptions[0].neg_asyncmap },
- { "nomagic", o_bool, &lcp_wantoptions[0].neg_magicnumber,
- "Disable magic number negotiation (looped-back line detection)",
- OPT_A2COPY, &lcp_allowoptions[0].neg_magicnumber },
- { "-mn", o_bool, &lcp_wantoptions[0].neg_magicnumber,
- "Disable magic number negotiation (looped-back line detection)",
- OPT_A2COPY, &lcp_allowoptions[0].neg_magicnumber },
- { "default-mru", o_bool, &lcp_wantoptions[0].neg_mru,
- "Disable MRU negotiation (use default 1500)",
- OPT_A2COPY, &lcp_allowoptions[0].neg_mru },
- { "-mru", o_bool, &lcp_wantoptions[0].neg_mru,
- "Disable MRU negotiation (use default 1500)",
- OPT_A2COPY, &lcp_allowoptions[0].neg_mru },
- { "mru", o_int, &lcp_wantoptions[0].mru,
- "Set MRU (maximum received packet size) for negotiation",
- 0, &lcp_wantoptions[0].neg_mru },
- { "nopcomp", o_bool, &lcp_wantoptions[0].neg_pcompression,
- "Disable protocol field compression",
- OPT_A2COPY, &lcp_allowoptions[0].neg_pcompression },
- { "-pc", o_bool, &lcp_wantoptions[0].neg_pcompression,
- "Disable protocol field compression",
- OPT_A2COPY, &lcp_allowoptions[0].neg_pcompression },
- { "-p", o_bool, &lcp_wantoptions[0].passive,
- "Set passive mode", 1 },
- { "passive", o_bool, &lcp_wantoptions[0].passive,
- "Set passive mode", 1 },
- { "silent", o_bool, &lcp_wantoptions[0].silent,
- "Set silent mode", 1 },
- { "escape", o_special, setescape,
- "List of character codes to escape on transmission" },
- { "lcp-echo-failure", o_int, &lcp_echo_fails,
- "Set number of consecutive echo failures to indicate link failure" },
- { "lcp-echo-interval", o_int, &lcp_echo_interval,
- "Set time in seconds between LCP echo requests" },
- { "lcp-restart", o_int, &lcp_fsm[0].timeouttime,
- "Set time in seconds between LCP retransmissions" },
- { "lcp-max-terminate", o_int, &lcp_fsm[0].maxtermtransmits,
- "Set maximum number of LCP terminate-request transmissions" },
- { "lcp-max-configure", o_int, &lcp_fsm[0].maxconfreqtransmits,
- "Set maximum number of LCP configure-request transmissions" },
- { "lcp-max-failure", o_int, &lcp_fsm[0].maxnakloops,
- "Set limit on number of LCP configure-naks" },
- { "receive-all", o_bool, &lax_recv,
- "Accept all received control characters", 1 },
- {NULL}
-};
-
-/* global vars */
-fsm lcp_fsm[NUM_PPP]; /* LCP fsm structure (global)*/
-lcp_options lcp_wantoptions[NUM_PPP]; /* Options that we want to request */
-lcp_options lcp_gotoptions[NUM_PPP]; /* Options that peer ack'd */
-lcp_options lcp_allowoptions[NUM_PPP]; /* Options we allow peer to request */
-lcp_options lcp_hisoptions[NUM_PPP]; /* Options that we ack'd */
-u_int32_t xmit_accm[NUM_PPP][8]; /* extended transmit ACCM */
-
-static int lcp_echos_pending = 0; /* Number of outstanding echo msgs */
-static int lcp_echo_number = 0; /* ID number of next echo frame */
-static int lcp_echo_timer_running = 0; /* set if a timer is running */
-
-static u_char nak_buffer[PPP_MRU]; /* where we construct a nak packet */
-
-/*
- * Callbacks for fsm code. (CI = Configuration Information)
- */
-static void lcp_resetci __P((fsm *)); /* Reset our CI */
-static int lcp_cilen __P((fsm *)); /* Return length of our CI */
-static void lcp_addci __P((fsm *, u_char *, int *)); /* Add our CI to pkt */
-static int lcp_ackci __P((fsm *, u_char *, int)); /* Peer ack'd our CI */
-static int lcp_nakci __P((fsm *, u_char *, int)); /* Peer nak'd our CI */
-static int lcp_rejci __P((fsm *, u_char *, int)); /* Peer rej'd our CI */
-static int lcp_reqci __P((fsm *, u_char *, int *, int)); /* Rcv peer CI */
-static void lcp_up __P((fsm *)); /* We're UP */
-static void lcp_down __P((fsm *)); /* We're DOWN */
-static void lcp_starting __P((fsm *)); /* We need lower layer up */
-static void lcp_finished __P((fsm *)); /* We need lower layer down */
-static int lcp_extcode __P((fsm *, int, int, u_char *, int));
-static void lcp_rprotrej __P((fsm *, u_char *, int));
-
-/*
- * routines to send LCP echos to peer
- */
-
-static void lcp_echo_lowerup __P((int));
-static void lcp_echo_lowerdown __P((int));
-static void LcpEchoTimeout __P((void *));
-static void lcp_received_echo_reply __P((fsm *, int, u_char *, int));
-static void LcpSendEchoRequest __P((fsm *));
-static void LcpLinkFailure __P((fsm *));
-static void LcpEchoCheck __P((fsm *));
-
-static fsm_callbacks lcp_callbacks = { /* LCP callback routines */
- lcp_resetci, /* Reset our Configuration Information */
- lcp_cilen, /* Length of our Configuration Information */
- lcp_addci, /* Add our Configuration Information */
- lcp_ackci, /* ACK our Configuration Information */
- lcp_nakci, /* NAK our Configuration Information */
- lcp_rejci, /* Reject our Configuration Information */
- lcp_reqci, /* Request peer's Configuration Information */
- lcp_up, /* Called when fsm reaches OPENED state */
- lcp_down, /* Called when fsm leaves OPENED state */
- lcp_starting, /* Called when we want the lower layer up */
- lcp_finished, /* Called when we want the lower layer down */
- NULL, /* Called when Protocol-Reject received */
- NULL, /* Retransmission is necessary */
- lcp_extcode, /* Called to handle LCP-specific codes */
- "LCP" /* String name of protocol */
-};
-
-/*
- * Protocol entry points.
- * Some of these are called directly.
- */
-
-static void lcp_init __P((int));
-static void lcp_input __P((int, u_char *, int));
-static void lcp_protrej __P((int));
-static int lcp_printpkt __P((u_char *, int,
- void (*) __P((void *, char *, ...)), void *));
-
-struct protent lcp_protent = {
- PPP_LCP,
- lcp_init,
- lcp_input,
- lcp_protrej,
- lcp_lowerup,
- lcp_lowerdown,
- lcp_open,
- lcp_close,
- lcp_printpkt,
- NULL,
- 1,
- "LCP",
- NULL,
- lcp_option_list,
- NULL,
- NULL,
- NULL
-};
-
-int lcp_loopbackfail = DEFLOOPBACKFAIL;
-
-/*
- * Length of each type of configuration option (in octets)
- */
-#define CILEN_VOID 2
-#define CILEN_CHAR 3
-#define CILEN_SHORT 4 /* CILEN_VOID + 2 */
-#define CILEN_CHAP 5 /* CILEN_VOID + 2 + 1 */
-#define CILEN_LONG 6 /* CILEN_VOID + 4 */
-#define CILEN_LQR 8 /* CILEN_VOID + 2 + 4 */
-#define CILEN_CBCP 3
-
-#define CODENAME(x) ((x) == CONFACK ? "ACK" : \
- (x) == CONFNAK ? "NAK" : "REJ")
-
-
-/*
- * setescape - add chars to the set we escape on transmission.
- */
-static int
-setescape(argv)
- char **argv;
-{
- int n, ret;
- char *p, *endp;
-
- p = *argv;
- ret = 1;
- while (*p) {
- n = strtol(p, &endp, 16);
- if (p == endp) {
- option_error("escape parameter contains invalid hex number '%s'",
- p);
- return 0;
- }
- p = endp;
- if (n < 0 || n == 0x5E || n > 0xFF) {
- option_error("can't escape character 0x%x", n);
- ret = 0;
- } else
- xmit_accm[0][n >> 5] |= 1 << (n & 0x1F);
- while (*p == ',' || *p == ' ')
- ++p;
- }
- return ret;
-}
-
-/*
- * lcp_init - Initialize LCP.
- */
-static void
-lcp_init(unit)
- int unit;
-{
- fsm *f = &lcp_fsm[unit];
- lcp_options *wo = &lcp_wantoptions[unit];
- lcp_options *ao = &lcp_allowoptions[unit];
-
- f->unit = unit;
- f->protocol = PPP_LCP;
- f->callbacks = &lcp_callbacks;
-
- fsm_init(f);
-
- wo->passive = 0;
- wo->silent = 0;
- wo->restart = 0; /* Set to 1 in kernels or multi-line
- implementations */
- wo->neg_mru = 1;
- wo->mru = DEFMRU;
- wo->neg_asyncmap = 1;
- wo->asyncmap = 0;
- wo->neg_chap = 0; /* Set to 1 on server */
- wo->neg_upap = 0; /* Set to 1 on server */
- wo->chap_mdtype = CHAP_DIGEST_MD5;
- wo->neg_magicnumber = 1;
- wo->neg_pcompression = 1;
- wo->neg_accompression = 1;
- wo->neg_lqr = 0; /* no LQR implementation yet */
- wo->neg_cbcp = 0;
-
- ao->neg_mru = 1;
- ao->mru = MAXMRU;
- ao->neg_asyncmap = 1;
- ao->asyncmap = 0;
- ao->neg_chap = 1;
- ao->chap_mdtype = CHAP_DIGEST_MD5;
- ao->neg_upap = 1;
- ao->neg_magicnumber = 1;
- ao->neg_pcompression = 1;
- ao->neg_accompression = 1;
- ao->neg_lqr = 0; /* no LQR implementation yet */
-#ifdef CBCP_SUPPORT
- ao->neg_cbcp = 1;
-#else
- ao->neg_cbcp = 0;
-#endif
-
- memset(xmit_accm[unit], 0, sizeof(xmit_accm[0]));
- xmit_accm[unit][3] = 0x60000000;
-}
-
-
-/*
- * lcp_open - LCP is allowed to come up.
- */
-void
-lcp_open(unit)
- int unit;
-{
- fsm *f = &lcp_fsm[unit];
- lcp_options *wo = &lcp_wantoptions[unit];
-
- f->flags = 0;
- if (wo->passive)
- f->flags |= OPT_PASSIVE;
- if (wo->silent)
- f->flags |= OPT_SILENT;
- fsm_open(f);
-}
-
-
-/*
- * lcp_close - Take LCP down.
- */
-void
-lcp_close(unit, reason)
- int unit;
- char *reason;
-{
- fsm *f = &lcp_fsm[unit];
-
- if (pppd_phase != PHASE_DEAD)
- new_phase(PHASE_TERMINATE);
- if (f->state == STOPPED && f->flags & (OPT_PASSIVE|OPT_SILENT)) {
- /*
- * This action is not strictly according to the FSM in RFC1548,
- * but it does mean that the program terminates if you do a
- * lcp_close() in passive/silent mode when a connection hasn't
- * been established.
- */
- f->state = CLOSED;
- lcp_finished(f);
-
- } else
- fsm_close(&lcp_fsm[unit], reason);
-}
-
-
-/*
- * lcp_lowerup - The lower layer is up.
- */
-void
-lcp_lowerup(unit)
- int unit;
-{
- lcp_options *wo = &lcp_wantoptions[unit];
-
- /*
- * Don't use A/C or protocol compression on transmission,
- * but accept A/C and protocol compressed packets
- * if we are going to ask for A/C and protocol compression.
- */
- ppp_set_xaccm(unit, xmit_accm[unit]);
- ppp_send_config(unit, PPP_MRU, 0xffffffff, 0, 0);
- ppp_recv_config(unit, PPP_MRU, (lax_recv? 0: 0xffffffff),
- wo->neg_pcompression, wo->neg_accompression);
- peer_mru[unit] = PPP_MRU;
- lcp_allowoptions[unit].asyncmap = xmit_accm[unit][0];
-
- fsm_lowerup(&lcp_fsm[unit]);
-}
-
-
-/*
- * lcp_lowerdown - The lower layer is down.
- */
-void
-lcp_lowerdown(unit)
- int unit;
-{
- fsm_lowerdown(&lcp_fsm[unit]);
-}
-
-
-/*
- * lcp_input - Input LCP packet.
- */
-static void
-lcp_input(unit, p, len)
- int unit;
- u_char *p;
- int len;
-{
- fsm *f = &lcp_fsm[unit];
-
- fsm_input(f, p, len);
-}
-
-
-/*
- * lcp_extcode - Handle a LCP-specific code.
- */
-static int
-lcp_extcode(f, code, id, inp, len)
- fsm *f;
- int code, id;
- u_char *inp;
- int len;
-{
- u_char *magp;
-
- switch( code ){
- case PROTREJ:
- lcp_rprotrej(f, inp, len);
- break;
-
- case ECHOREQ:
- if (f->state != OPENED)
- break;
- magp = inp;
- PUTLONG(lcp_gotoptions[f->unit].magicnumber, magp);
- fsm_sdata(f, ECHOREP, id, inp, len);
- break;
-
- case ECHOREP:
- lcp_received_echo_reply(f, id, inp, len);
- break;
-
- case DISCREQ:
- break;
-
- default:
- return 0;
- }
- return 1;
-}
-
-
-/*
- * lcp_rprotrej - Receive an Protocol-Reject.
- *
- * Figure out which protocol is rejected and inform it.
- */
-static void
-lcp_rprotrej(f, inp, len)
- fsm *f;
- u_char *inp;
- int len;
-{
- int i;
- struct protent *protp;
- u_short prot;
-
- if (len < 2) {
- LCPDEBUG(("lcp_rprotrej: Rcvd short Protocol-Reject packet!"));
- return;
- }
-
- GETSHORT(prot, inp);
-
- /*
- * Protocol-Reject packets received in any state other than the LCP
- * OPENED state SHOULD be silently discarded.
- */
- if( f->state != OPENED ){
- LCPDEBUG(("Protocol-Reject discarded: LCP in state %d", f->state));
- return;
- }
-
- /*
- * Upcall the proper Protocol-Reject routine.
- */
- for (i = 0; (protp = protocols[i]) != NULL; ++i)
- if (protp->protocol == prot && protp->enabled_flag) {
- (*protp->protrej)(f->unit);
- return;
- }
-
- warn("Protocol-Reject for unsupported protocol 0x%x", prot);
-}
-
-
-/*
- * lcp_protrej - A Protocol-Reject was received.
- */
-/*ARGSUSED*/
-static void
-lcp_protrej(unit)
- int unit;
-{
- /*
- * Can't reject LCP!
- */
- error("Received Protocol-Reject for LCP!");
- fsm_protreject(&lcp_fsm[unit]);
-}
-
-
-/*
- * lcp_sprotrej - Send a Protocol-Reject for some protocol.
- */
-void
-lcp_sprotrej(unit, p, len)
- int unit;
- u_char *p;
- int len;
-{
- /*
- * Send back the protocol and the information field of the
- * rejected packet. We only get here if LCP is in the OPENED state.
- */
- p += 2;
- len -= 2;
-
- fsm_sdata(&lcp_fsm[unit], PROTREJ, ++lcp_fsm[unit].id,
- p, len);
-}
-
-
-/*
- * lcp_resetci - Reset our CI.
- */
-static void
-lcp_resetci(f)
- fsm *f;
-{
- lcp_wantoptions[f->unit].magicnumber = magic();
- lcp_wantoptions[f->unit].numloops = 0;
- lcp_gotoptions[f->unit] = lcp_wantoptions[f->unit];
- peer_mru[f->unit] = PPP_MRU;
- auth_reset(f->unit);
-}
-
-
-/*
- * lcp_cilen - Return length of our CI.
- */
-static int
-lcp_cilen(f)
- fsm *f;
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
-
-#define LENCIVOID(neg) ((neg) ? CILEN_VOID : 0)
-#define LENCICHAP(neg) ((neg) ? CILEN_CHAP : 0)
-#define LENCISHORT(neg) ((neg) ? CILEN_SHORT : 0)
-#define LENCILONG(neg) ((neg) ? CILEN_LONG : 0)
-#define LENCILQR(neg) ((neg) ? CILEN_LQR: 0)
-#define LENCICBCP(neg) ((neg) ? CILEN_CBCP: 0)
- /*
- * NB: we only ask for one of CHAP and UPAP, even if we will
- * accept either.
- */
- return (LENCISHORT(go->neg_mru && go->mru != DEFMRU) +
- LENCILONG(go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF) +
- LENCICHAP(go->neg_chap) +
- LENCISHORT(!go->neg_chap && go->neg_upap) +
- LENCILQR(go->neg_lqr) +
- LENCICBCP(go->neg_cbcp) +
- LENCILONG(go->neg_magicnumber) +
- LENCIVOID(go->neg_pcompression) +
- LENCIVOID(go->neg_accompression));
-}
-
-
-/*
- * lcp_addci - Add our desired CIs to a packet.
- */
-static void
-lcp_addci(f, ucp, lenp)
- fsm *f;
- u_char *ucp;
- int *lenp;
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
- u_char *start_ucp = ucp;
-
-#define ADDCIVOID(opt, neg) \
- if (neg) { \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_VOID, ucp); \
- }
-#define ADDCISHORT(opt, neg, val) \
- if (neg) { \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_SHORT, ucp); \
- PUTSHORT(val, ucp); \
- }
-#define ADDCICHAP(opt, neg, val, digest) \
- if (neg) { \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_CHAP, ucp); \
- PUTSHORT(val, ucp); \
- PUTCHAR(digest, ucp); \
- }
-#define ADDCILONG(opt, neg, val) \
- if (neg) { \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_LONG, ucp); \
- PUTLONG(val, ucp); \
- }
-#define ADDCILQR(opt, neg, val) \
- if (neg) { \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_LQR, ucp); \
- PUTSHORT(PPP_LQR, ucp); \
- PUTLONG(val, ucp); \
- }
-#define ADDCICHAR(opt, neg, val) \
- if (neg) { \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_CHAR, ucp); \
- PUTCHAR(val, ucp); \
- }
-
- ADDCISHORT(CI_MRU, go->neg_mru && go->mru != DEFMRU, go->mru);
- ADDCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF,
- go->asyncmap);
- ADDCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP, go->chap_mdtype);
- ADDCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);
- ADDCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);
- ADDCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);
- ADDCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber);
- ADDCIVOID(CI_PCOMPRESSION, go->neg_pcompression);
- ADDCIVOID(CI_ACCOMPRESSION, go->neg_accompression);
-
- if (ucp - start_ucp != *lenp) {
- /* this should never happen, because peer_mtu should be 1500 */
- error("Bug in lcp_addci: wrong length");
- }
-}
-
-
-/*
- * lcp_ackci - Ack our CIs.
- * This should not modify any state if the Ack is bad.
- *
- * Returns:
- * 0 - Ack was bad.
- * 1 - Ack was good.
- */
-static int
-lcp_ackci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
- u_char cilen, citype, cichar;
- u_short cishort;
- u_int32_t cilong;
-
- /*
- * CIs must be in exactly the same order that we sent.
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-#define ACKCIVOID(opt, neg) \
- if (neg) { \
- if ((len -= CILEN_VOID) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_VOID || \
- citype != opt) \
- goto bad; \
- }
-#define ACKCISHORT(opt, neg, val) \
- if (neg) { \
- if ((len -= CILEN_SHORT) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_SHORT || \
- citype != opt) \
- goto bad; \
- GETSHORT(cishort, p); \
- if (cishort != val) \
- goto bad; \
- }
-#define ACKCICHAR(opt, neg, val) \
- if (neg) { \
- if ((len -= CILEN_CHAR) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_CHAR || \
- citype != opt) \
- goto bad; \
- GETCHAR(cichar, p); \
- if (cichar != val) \
- goto bad; \
- }
-#define ACKCICHAP(opt, neg, val, digest) \
- if (neg) { \
- if ((len -= CILEN_CHAP) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_CHAP || \
- citype != opt) \
- goto bad; \
- GETSHORT(cishort, p); \
- if (cishort != val) \
- goto bad; \
- GETCHAR(cichar, p); \
- if (cichar != digest) \
- goto bad; \
- }
-#define ACKCILONG(opt, neg, val) \
- if (neg) { \
- if ((len -= CILEN_LONG) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_LONG || \
- citype != opt) \
- goto bad; \
- GETLONG(cilong, p); \
- if (cilong != val) \
- goto bad; \
- }
-#define ACKCILQR(opt, neg, val) \
- if (neg) { \
- if ((len -= CILEN_LQR) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_LQR || \
- citype != opt) \
- goto bad; \
- GETSHORT(cishort, p); \
- if (cishort != PPP_LQR) \
- goto bad; \
- GETLONG(cilong, p); \
- if (cilong != val) \
- goto bad; \
- }
-
- ACKCISHORT(CI_MRU, go->neg_mru && go->mru != DEFMRU, go->mru);
- ACKCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF,
- go->asyncmap);
- ACKCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP, go->chap_mdtype);
- ACKCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);
- ACKCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);
- ACKCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);
- ACKCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber);
- ACKCIVOID(CI_PCOMPRESSION, go->neg_pcompression);
- ACKCIVOID(CI_ACCOMPRESSION, go->neg_accompression);
-
- /*
- * If there are any remaining CIs, then this packet is bad.
- */
- if (len != 0)
- goto bad;
- return (1);
-bad:
- LCPDEBUG(("lcp_acki: received bad Ack!"));
- return (0);
-}
-
-
-/*
- * lcp_nakci - Peer has sent a NAK for some of our CIs.
- * This should not modify any state if the Nak is bad
- * or if LCP is in the OPENED state.
- *
- * Returns:
- * 0 - Nak was bad.
- * 1 - Nak was good.
- */
-static int
-lcp_nakci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
- lcp_options *wo = &lcp_wantoptions[f->unit];
- u_char citype, cichar, *next;
- u_short cishort;
- u_int32_t cilong;
- lcp_options no; /* options we've seen Naks for */
- lcp_options try; /* options to request next time */
- int looped_back = 0;
- int cilen;
-
- BZERO(&no, sizeof(no));
- try = *go;
-
- /*
- * Any Nak'd CIs must be in exactly the same order that we sent.
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-#define NAKCIVOID(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_VOID && \
- p[1] == CILEN_VOID && \
- p[0] == opt) { \
- len -= CILEN_VOID; \
- INCPTR(CILEN_VOID, p); \
- no.neg = 1; \
- code \
- }
-#define NAKCICHAP(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_CHAP && \
- p[1] == CILEN_CHAP && \
- p[0] == opt) { \
- len -= CILEN_CHAP; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- GETCHAR(cichar, p); \
- no.neg = 1; \
- code \
- }
-#define NAKCICHAR(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_CHAR && \
- p[1] == CILEN_CHAR && \
- p[0] == opt) { \
- len -= CILEN_CHAR; \
- INCPTR(2, p); \
- GETCHAR(cichar, p); \
- no.neg = 1; \
- code \
- }
-#define NAKCISHORT(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_SHORT && \
- p[1] == CILEN_SHORT && \
- p[0] == opt) { \
- len -= CILEN_SHORT; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- no.neg = 1; \
- code \
- }
-#define NAKCILONG(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_LONG && \
- p[1] == CILEN_LONG && \
- p[0] == opt) { \
- len -= CILEN_LONG; \
- INCPTR(2, p); \
- GETLONG(cilong, p); \
- no.neg = 1; \
- code \
- }
-#define NAKCILQR(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_LQR && \
- p[1] == CILEN_LQR && \
- p[0] == opt) { \
- len -= CILEN_LQR; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- GETLONG(cilong, p); \
- no.neg = 1; \
- code \
- }
-
- /*
- * We don't care if they want to send us smaller packets than
- * we want. Therefore, accept any MRU less than what we asked for,
- * but then ignore the new value when setting the MRU in the kernel.
- * If they send us a bigger MRU than what we asked, accept it, up to
- * the limit of the default MRU we'd get if we didn't negotiate.
- */
- if (go->neg_mru && go->mru != DEFMRU) {
- NAKCISHORT(CI_MRU, neg_mru,
- if (cishort <= wo->mru || cishort <= DEFMRU)
- try.mru = cishort;
- );
- }
-
- /*
- * Add any characters they want to our (receive-side) asyncmap.
- */
- if (go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF) {
- NAKCILONG(CI_ASYNCMAP, neg_asyncmap,
- try.asyncmap = go->asyncmap | cilong;
- );
- }
-
- /*
- * If they've nak'd our authentication-protocol, check whether
- * they are proposing a different protocol, or a different
- * hash algorithm for CHAP.
- */
- if ((go->neg_chap || go->neg_upap)
- && len >= CILEN_SHORT
- && p[0] == CI_AUTHTYPE && p[1] >= CILEN_SHORT && p[1] <= len) {
- cilen = p[1];
- len -= cilen;
- no.neg_chap = go->neg_chap;
- no.neg_upap = go->neg_upap;
- INCPTR(2, p);
- GETSHORT(cishort, p);
- if (cishort == PPP_PAP && cilen == CILEN_SHORT) {
- /*
- * If we were asking for CHAP, they obviously don't want to do it.
- * If we weren't asking for CHAP, then we were asking for PAP,
- * in which case this Nak is bad.
- */
- if (!go->neg_chap)
- goto bad;
- try.neg_chap = 0;
-
- } else if (cishort == PPP_CHAP && cilen == CILEN_CHAP) {
- GETCHAR(cichar, p);
- if (go->neg_chap) {
- /*
- * We were asking for CHAP/MD5; they must want a different
- * algorithm. If they can't do MD5, we can ask for M$-CHAP
- * if we support it, otherwise we'll have to stop
- * asking for CHAP.
- */
- if (cichar != go->chap_mdtype) {
-#ifdef CHAPMS
- if (cichar == CHAP_MICROSOFT)
- go->chap_mdtype = CHAP_MICROSOFT;
- else
-#endif /* CHAPMS */
- try.neg_chap = 0;
- }
- } else {
- /*
- * Stop asking for PAP if we were asking for it.
- */
- try.neg_upap = 0;
- }
-
- } else {
- /*
- * We don't recognize what they're suggesting.
- * Stop asking for what we were asking for.
- */
- if (go->neg_chap)
- try.neg_chap = 0;
- else
- try.neg_upap = 0;
- p += cilen - CILEN_SHORT;
- }
- }
-
- /*
- * If they can't cope with our link quality protocol, we'll have
- * to stop asking for LQR. We haven't got any other protocol.
- * If they Nak the reporting period, take their value XXX ?
- */
- NAKCILQR(CI_QUALITY, neg_lqr,
- if (cishort != PPP_LQR)
- try.neg_lqr = 0;
- else
- try.lqr_period = cilong;
- );
-
- /*
- * Only implementing CBCP...not the rest of the callback options
- */
- NAKCICHAR(CI_CALLBACK, neg_cbcp,
- try.neg_cbcp = 0;
- );
-
- /*
- * Check for a looped-back line.
- */
- NAKCILONG(CI_MAGICNUMBER, neg_magicnumber,
- try.magicnumber = magic();
- looped_back = 1;
- );
-
- /*
- * Peer shouldn't send Nak for protocol compression or
- * address/control compression requests; they should send
- * a Reject instead. If they send a Nak, treat it as a Reject.
- */
- NAKCIVOID(CI_PCOMPRESSION, neg_pcompression,
- try.neg_pcompression = 0;
- );
- NAKCIVOID(CI_ACCOMPRESSION, neg_accompression,
- try.neg_accompression = 0;
- );
-
- /*
- * There may be remaining CIs, if the peer is requesting negotiation
- * on an option that we didn't include in our request packet.
- * If we see an option that we requested, or one we've already seen
- * in this packet, then this packet is bad.
- * If we wanted to respond by starting to negotiate on the requested
- * option(s), we could, but we don't, because except for the
- * authentication type and quality protocol, if we are not negotiating
- * an option, it is because we were told not to.
- * For the authentication type, the Nak from the peer means
- * `let me authenticate myself with you' which is a bit pointless.
- * For the quality protocol, the Nak means `ask me to send you quality
- * reports', but if we didn't ask for them, we don't want them.
- * An option we don't recognize represents the peer asking to
- * negotiate some option we don't support, so ignore it.
- */
- while (len > CILEN_VOID) {
- GETCHAR(citype, p);
- GETCHAR(cilen, p);
- if (cilen < CILEN_VOID || (len -= cilen) < 0)
- goto bad;
- next = p + cilen - 2;
-
- switch (citype) {
- case CI_MRU:
- if ((go->neg_mru && go->mru != DEFMRU)
- || no.neg_mru || cilen != CILEN_SHORT)
- goto bad;
- GETSHORT(cishort, p);
- if (cishort < DEFMRU)
- try.mru = cishort;
- break;
- case CI_ASYNCMAP:
- if ((go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF)
- || no.neg_asyncmap || cilen != CILEN_LONG)
- goto bad;
- break;
- case CI_AUTHTYPE:
- if (go->neg_chap || no.neg_chap || go->neg_upap || no.neg_upap)
- goto bad;
- break;
- case CI_MAGICNUMBER:
- if (go->neg_magicnumber || no.neg_magicnumber ||
- cilen != CILEN_LONG)
- goto bad;
- break;
- case CI_PCOMPRESSION:
- if (go->neg_pcompression || no.neg_pcompression
- || cilen != CILEN_VOID)
- goto bad;
- break;
- case CI_ACCOMPRESSION:
- if (go->neg_accompression || no.neg_accompression
- || cilen != CILEN_VOID)
- goto bad;
- break;
- case CI_QUALITY:
- if (go->neg_lqr || no.neg_lqr || cilen != CILEN_LQR)
- goto bad;
- break;
- }
- p = next;
- }
-
- /*
- * OK, the Nak is good. Now we can update state.
- * If there are any options left we ignore them.
- */
- if (f->state != OPENED) {
- if (looped_back) {
- if (++try.numloops >= lcp_loopbackfail) {
- notice("Serial line is looped back.");
- lcp_close(f->unit, "Loopback detected");
- pppd_status = EXIT_LOOPBACK;
- }
- } else
- try.numloops = 0;
- *go = try;
- }
-
- return 1;
-
-bad:
- LCPDEBUG(("lcp_nakci: received bad Nak!"));
- return 0;
-}
-
-
-/*
- * lcp_rejci - Peer has Rejected some of our CIs.
- * This should not modify any state if the Reject is bad
- * or if LCP is in the OPENED state.
- *
- * Returns:
- * 0 - Reject was bad.
- * 1 - Reject was good.
- */
-static int
-lcp_rejci(f, p, len)
- fsm *f;
- u_char *p;
- int len;
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
- u_char cichar;
- u_short cishort;
- u_int32_t cilong;
- lcp_options try; /* options to request next time */
-
- try = *go;
-
- /*
- * Any Rejected CIs must be in exactly the same order that we sent.
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-#define REJCIVOID(opt, neg) \
- if (go->neg && \
- len >= CILEN_VOID && \
- p[1] == CILEN_VOID && \
- p[0] == opt) { \
- len -= CILEN_VOID; \
- INCPTR(CILEN_VOID, p); \
- try.neg = 0; \
- }
-#define REJCISHORT(opt, neg, val) \
- if (go->neg && \
- len >= CILEN_SHORT && \
- p[1] == CILEN_SHORT && \
- p[0] == opt) { \
- len -= CILEN_SHORT; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- /* Check rejected value. */ \
- if (cishort != val) \
- goto bad; \
- try.neg = 0; \
- }
-#define REJCICHAP(opt, neg, val, digest) \
- if (go->neg && \
- len >= CILEN_CHAP && \
- p[1] == CILEN_CHAP && \
- p[0] == opt) { \
- len -= CILEN_CHAP; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- GETCHAR(cichar, p); \
- /* Check rejected value. */ \
- if (cishort != val || cichar != digest) \
- goto bad; \
- try.neg = 0; \
- try.neg_upap = 0; \
- }
-#define REJCILONG(opt, neg, val) \
- if (go->neg && \
- len >= CILEN_LONG && \
- p[1] == CILEN_LONG && \
- p[0] == opt) { \
- len -= CILEN_LONG; \
- INCPTR(2, p); \
- GETLONG(cilong, p); \
- /* Check rejected value. */ \
- if (cilong != val) \
- goto bad; \
- try.neg = 0; \
- }
-#define REJCILQR(opt, neg, val) \
- if (go->neg && \
- len >= CILEN_LQR && \
- p[1] == CILEN_LQR && \
- p[0] == opt) { \
- len -= CILEN_LQR; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- GETLONG(cilong, p); \
- /* Check rejected value. */ \
- if (cishort != PPP_LQR || cilong != val) \
- goto bad; \
- try.neg = 0; \
- }
-#define REJCICBCP(opt, neg, val) \
- if (go->neg && \
- len >= CILEN_CBCP && \
- p[1] == CILEN_CBCP && \
- p[0] == opt) { \
- len -= CILEN_CBCP; \
- INCPTR(2, p); \
- GETCHAR(cichar, p); \
- /* Check rejected value. */ \
- if (cichar != val) \
- goto bad; \
- try.neg = 0; \
- }
-
- REJCISHORT(CI_MRU, neg_mru, go->mru);
- REJCILONG(CI_ASYNCMAP, neg_asyncmap, go->asyncmap);
- REJCICHAP(CI_AUTHTYPE, neg_chap, PPP_CHAP, go->chap_mdtype);
- if (!go->neg_chap) {
- REJCISHORT(CI_AUTHTYPE, neg_upap, PPP_PAP);
- }
- REJCILQR(CI_QUALITY, neg_lqr, go->lqr_period);
- REJCICBCP(CI_CALLBACK, neg_cbcp, CBCP_OPT);
- REJCILONG(CI_MAGICNUMBER, neg_magicnumber, go->magicnumber);
- REJCIVOID(CI_PCOMPRESSION, neg_pcompression);
- REJCIVOID(CI_ACCOMPRESSION, neg_accompression);
-
- /*
- * If there are any remaining CIs, then this packet is bad.
- */
- if (len != 0)
- goto bad;
- /*
- * Now we can update state.
- */
- if (f->state != OPENED)
- *go = try;
- return 1;
-
-bad:
- LCPDEBUG(("lcp_rejci: received bad Reject!"));
- return 0;
-}
-
-
-/*
- * lcp_reqci - Check the peer's requested CIs and send appropriate response.
- *
- * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified
- * appropriately. If reject_if_disagree is non-zero, doesn't return
- * CONFNAK; returns CONFREJ if it can't return CONFACK.
- */
-static int
-lcp_reqci(f, inp, lenp, reject_if_disagree)
- fsm *f;
- u_char *inp; /* Requested CIs */
- int *lenp; /* Length of requested CIs */
- int reject_if_disagree;
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
- lcp_options *ho = &lcp_hisoptions[f->unit];
- lcp_options *ao = &lcp_allowoptions[f->unit];
- u_char *cip, *next; /* Pointer to current and next CIs */
- int cilen, citype, cichar; /* Parsed len, type, char value */
- u_short cishort; /* Parsed short value */
- u_int32_t cilong; /* Parse long value */
- int rc = CONFACK; /* Final packet return code */
- int orc; /* Individual option return code */
- u_char *p; /* Pointer to next char to parse */
- u_char *rejp; /* Pointer to next char in reject frame */
- u_char *nakp; /* Pointer to next char in Nak frame */
- int l = *lenp; /* Length left */
-
- /*
- * Reset all his options.
- */
- BZERO(ho, sizeof(*ho));
-
- /*
- * Process all his options.
- */
- next = inp;
- nakp = nak_buffer;
- rejp = inp;
- while (l) {
- orc = CONFACK; /* Assume success */
- cip = p = next; /* Remember begining of CI */
- if (l < 2 || /* Not enough data for CI header or */
- p[1] < 2 || /* CI length too small or */
- p[1] > l) { /* CI length too big? */
- LCPDEBUG(("lcp_reqci: bad CI length!"));
- orc = CONFREJ; /* Reject bad CI */
- cilen = l; /* Reject till end of packet */
- l = 0; /* Don't loop again */
- citype = 0;
- goto endswitch;
- }
- GETCHAR(citype, p); /* Parse CI type */
- GETCHAR(cilen, p); /* Parse CI length */
- l -= cilen; /* Adjust remaining length */
- next += cilen; /* Step to next CI */
-
- switch (citype) { /* Check CI type */
- case CI_MRU:
- if (!ao->neg_mru || /* Allow option? */
- cilen != CILEN_SHORT) { /* Check CI length */
- orc = CONFREJ; /* Reject CI */
- break;
- }
- GETSHORT(cishort, p); /* Parse MRU */
-
- /*
- * He must be able to receive at least our minimum.
- * No need to check a maximum. If he sends a large number,
- * we'll just ignore it.
- */
- if (cishort < MINMRU) {
- orc = CONFNAK; /* Nak CI */
- PUTCHAR(CI_MRU, nakp);
- PUTCHAR(CILEN_SHORT, nakp);
- PUTSHORT(MINMRU, nakp); /* Give him a hint */
- break;
- }
- ho->neg_mru = 1; /* Remember he sent MRU */
- ho->mru = cishort; /* And remember value */
- break;
-
- case CI_ASYNCMAP:
- if (!ao->neg_asyncmap ||
- cilen != CILEN_LONG) {
- orc = CONFREJ;
- break;
- }
- GETLONG(cilong, p);
-
- /*
- * Asyncmap must have set at least the bits
- * which are set in lcp_allowoptions[unit].asyncmap.
- */
- if ((ao->asyncmap & ~cilong) != 0) {
- orc = CONFNAK;
- PUTCHAR(CI_ASYNCMAP, nakp);
- PUTCHAR(CILEN_LONG, nakp);
- PUTLONG(ao->asyncmap | cilong, nakp);
- break;
- }
- ho->neg_asyncmap = 1;
- ho->asyncmap = cilong;
- break;
-
- case CI_AUTHTYPE:
- if (cilen < CILEN_SHORT ||
- !(ao->neg_upap || ao->neg_chap)) {
- /*
- * Reject the option if we're not willing to authenticate.
- */
- orc = CONFREJ;
- break;
- }
- GETSHORT(cishort, p);
-
- /*
- * Authtype must be PAP or CHAP.
- *
- * Note: if both ao->neg_upap and ao->neg_chap are set,
- * and the peer sends a Configure-Request with two
- * authenticate-protocol requests, one for CHAP and one
- * for UPAP, then we will reject the second request.
- * Whether we end up doing CHAP or UPAP depends then on
- * the ordering of the CIs in the peer's Configure-Request.
- */
-
- if (cishort == PPP_PAP) {
- if (ho->neg_chap || /* we've already accepted CHAP */
- cilen != CILEN_SHORT) {
- LCPDEBUG(("lcp_reqci: rcvd AUTHTYPE PAP, rejecting..."));
- orc = CONFREJ;
- break;
- }
- if (!ao->neg_upap) { /* we don't want to do PAP */
- orc = CONFNAK; /* NAK it and suggest CHAP */
- PUTCHAR(CI_AUTHTYPE, nakp);
- PUTCHAR(CILEN_CHAP, nakp);
- PUTSHORT(PPP_CHAP, nakp);
- PUTCHAR(ao->chap_mdtype, nakp);
- /* XXX if we can do CHAP_MICROSOFT as well, we should
- probably put in another option saying so */
- break;
- }
- ho->neg_upap = 1;
- break;
- }
- if (cishort == PPP_CHAP) {
- if (ho->neg_upap || /* we've already accepted PAP */
- cilen != CILEN_CHAP) {
- LCPDEBUG(("lcp_reqci: rcvd AUTHTYPE CHAP, rejecting..."));
- orc = CONFREJ;
- break;
- }
- if (!ao->neg_chap) { /* we don't want to do CHAP */
- orc = CONFNAK; /* NAK it and suggest PAP */
- PUTCHAR(CI_AUTHTYPE, nakp);
- PUTCHAR(CILEN_SHORT, nakp);
- PUTSHORT(PPP_PAP, nakp);
- break;
- }
- GETCHAR(cichar, p); /* get digest type*/
- if (cichar != CHAP_DIGEST_MD5
-#ifdef CHAPMS
- && cichar != CHAP_MICROSOFT
-#endif
- ) {
- orc = CONFNAK;
- PUTCHAR(CI_AUTHTYPE, nakp);
- PUTCHAR(CILEN_CHAP, nakp);
- PUTSHORT(PPP_CHAP, nakp);
- PUTCHAR(ao->chap_mdtype, nakp);
- break;
- }
- ho->chap_mdtype = cichar; /* save md type */
- ho->neg_chap = 1;
- break;
- }
-
- /*
- * We don't recognize the protocol they're asking for.
- * Nak it with something we're willing to do.
- * (At this point we know ao->neg_upap || ao->neg_chap.)
- */
- orc = CONFNAK;
- PUTCHAR(CI_AUTHTYPE, nakp);
- if (ao->neg_chap) {
- PUTCHAR(CILEN_CHAP, nakp);
- PUTSHORT(PPP_CHAP, nakp);
- PUTCHAR(ao->chap_mdtype, nakp);
- } else {
- PUTCHAR(CILEN_SHORT, nakp);
- PUTSHORT(PPP_PAP, nakp);
- }
- break;
-
- case CI_QUALITY:
- if (!ao->neg_lqr ||
- cilen != CILEN_LQR) {
- orc = CONFREJ;
- break;
- }
-
- GETSHORT(cishort, p);
- GETLONG(cilong, p);
-
- /*
- * Check the protocol and the reporting period.
- * XXX When should we Nak this, and what with?
- */
- if (cishort != PPP_LQR) {
- orc = CONFNAK;
- PUTCHAR(CI_QUALITY, nakp);
- PUTCHAR(CILEN_LQR, nakp);
- PUTSHORT(PPP_LQR, nakp);
- PUTLONG(ao->lqr_period, nakp);
- break;
- }
- break;
-
- case CI_MAGICNUMBER:
- if (!(ao->neg_magicnumber || go->neg_magicnumber) ||
- cilen != CILEN_LONG) {
- orc = CONFREJ;
- break;
- }
- GETLONG(cilong, p);
-
- /*
- * He must have a different magic number.
- */
- if (go->neg_magicnumber &&
- cilong == go->magicnumber) {
- cilong = magic(); /* Don't put magic() inside macro! */
- orc = CONFNAK;
- PUTCHAR(CI_MAGICNUMBER, nakp);
- PUTCHAR(CILEN_LONG, nakp);
- PUTLONG(cilong, nakp);
- break;
- }
- ho->neg_magicnumber = 1;
- ho->magicnumber = cilong;
- break;
-
-
- case CI_PCOMPRESSION:
- if (!ao->neg_pcompression ||
- cilen != CILEN_VOID) {
- orc = CONFREJ;
- break;
- }
- ho->neg_pcompression = 1;
- break;
-
- case CI_ACCOMPRESSION:
- if (!ao->neg_accompression ||
- cilen != CILEN_VOID) {
- orc = CONFREJ;
- break;
- }
- ho->neg_accompression = 1;
- break;
-
- default:
- LCPDEBUG(("lcp_reqci: rcvd unknown option %d", citype));
- orc = CONFREJ;
- break;
- }
-
-endswitch:
- if (orc == CONFACK && /* Good CI */
- rc != CONFACK) /* but prior CI wasnt? */
- continue; /* Don't send this one */
-
- if (orc == CONFNAK) { /* Nak this CI? */
- if (reject_if_disagree /* Getting fed up with sending NAKs? */
- && citype != CI_MAGICNUMBER) {
- orc = CONFREJ; /* Get tough if so */
- } else {
- if (rc == CONFREJ) /* Rejecting prior CI? */
- continue; /* Don't send this one */
- rc = CONFNAK;
- }
- }
- if (orc == CONFREJ) { /* Reject this CI */
- rc = CONFREJ;
- if (cip != rejp) /* Need to move rejected CI? */
- BCOPY(cip, rejp, cilen); /* Move it */
- INCPTR(cilen, rejp); /* Update output pointer */
- }
- }
-
- /*
- * If we wanted to send additional NAKs (for unsent CIs), the
- * code would go here. The extra NAKs would go at *nakp.
- * At present there are no cases where we want to ask the
- * peer to negotiate an option.
- */
-
- switch (rc) {
- case CONFACK:
- *lenp = next - inp;
- break;
- case CONFNAK:
- /*
- * Copy the Nak'd options from the nak_buffer to the caller's buffer.
- */
- *lenp = nakp - nak_buffer;
- BCOPY(nak_buffer, inp, *lenp);
- break;
- case CONFREJ:
- *lenp = rejp - inp;
- break;
- }
-
- LCPDEBUG(("lcp_reqci: returning CONF%s.", CODENAME(rc)));
- return (rc); /* Return final code */
-}
-
-
-/*
- * lcp_up - LCP has come UP.
- */
-static void
-lcp_up(f)
- fsm *f;
-{
- lcp_options *wo = &lcp_wantoptions[f->unit];
- lcp_options *ho = &lcp_hisoptions[f->unit];
- lcp_options *go = &lcp_gotoptions[f->unit];
- lcp_options *ao = &lcp_allowoptions[f->unit];
-
- if (!go->neg_magicnumber)
- go->magicnumber = 0;
- if (!ho->neg_magicnumber)
- ho->magicnumber = 0;
-
- /*
- * Set our MTU to the smaller of the MTU we wanted and
- * the MRU our peer wanted. If we negotiated an MRU,
- * set our MRU to the larger of value we wanted and
- * the value we got in the negotiation.
- */
- ppp_send_config(f->unit, MIN(ao->mru, (ho->neg_mru? ho->mru: PPP_MRU)),
- (ho->neg_asyncmap? ho->asyncmap: 0xffffffff),
- ho->neg_pcompression, ho->neg_accompression);
- ppp_recv_config(f->unit, (go->neg_mru? MAX(wo->mru, go->mru): PPP_MRU),
- (lax_recv? 0: go->neg_asyncmap? go->asyncmap: 0xffffffff),
- go->neg_pcompression, go->neg_accompression);
-
- if (ho->neg_mru)
- peer_mru[f->unit] = ho->mru;
-
- lcp_echo_lowerup(f->unit); /* Enable echo messages */
-
- link_established(f->unit);
-}
-
-
-/*
- * lcp_down - LCP has gone DOWN.
- *
- * Alert other protocols.
- */
-static void
-lcp_down(f)
- fsm *f;
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
-
- lcp_echo_lowerdown(f->unit);
-
- link_down(f->unit);
-
- ppp_send_config(f->unit, PPP_MRU, 0xffffffff, 0, 0);
- ppp_recv_config(f->unit, PPP_MRU,
- (go->neg_asyncmap? go->asyncmap: 0xffffffff),
- go->neg_pcompression, go->neg_accompression);
- peer_mru[f->unit] = PPP_MRU;
-}
-
-
-/*
- * lcp_starting - LCP needs the lower layer up.
- */
-static void
-lcp_starting(f)
- fsm *f;
-{
- link_required(f->unit);
-}
-
-
-/*
- * lcp_finished - LCP has finished with the lower layer.
- */
-static void
-lcp_finished(f)
- fsm *f;
-{
- link_terminated(f->unit);
-}
-
-
-/*
- * lcp_printpkt - print the contents of an LCP packet.
- */
-static char *lcp_codenames[] = {
- "ConfReq", "ConfAck", "ConfNak", "ConfRej",
- "TermReq", "TermAck", "CodeRej", "ProtRej",
- "EchoReq", "EchoRep", "DiscReq"
-};
-
-static int
-lcp_printpkt(p, plen, printer, arg)
- u_char *p;
- int plen;
- void (*printer) __P((void *, char *, ...));
- void *arg;
-{
- int code, id, len, olen;
- u_char *pstart, *optend;
- u_short cishort;
- u_int32_t cilong;
-
- if (plen < HEADERLEN)
- return 0;
- pstart = p;
- GETCHAR(code, p);
- GETCHAR(id, p);
- GETSHORT(len, p);
- if (len < HEADERLEN || len > plen)
- return 0;
-
- if (code >= 1 && code <= sizeof(lcp_codenames) / sizeof(char *))
- printer(arg, " %s", lcp_codenames[code-1]);
- else
- printer(arg, " code=0x%x", code);
- printer(arg, " id=0x%x", id);
- len -= HEADERLEN;
- switch (code) {
- case CONFREQ:
- case CONFACK:
- case CONFNAK:
- case CONFREJ:
- /* print option list */
- while (len >= 2) {
- GETCHAR(code, p);
- GETCHAR(olen, p);
- p -= 2;
- if (olen < 2 || olen > len) {
- break;
- }
- printer(arg, " <");
- len -= olen;
- optend = p + olen;
- switch (code) {
- case CI_MRU:
- if (olen == CILEN_SHORT) {
- p += 2;
- GETSHORT(cishort, p);
- printer(arg, "mru %d", cishort);
- }
- break;
- case CI_ASYNCMAP:
- if (olen == CILEN_LONG) {
- p += 2;
- GETLONG(cilong, p);
- printer(arg, "asyncmap 0x%x", cilong);
- }
- break;
- case CI_AUTHTYPE:
- if (olen >= CILEN_SHORT) {
- p += 2;
- printer(arg, "auth ");
- GETSHORT(cishort, p);
- switch (cishort) {
- case PPP_PAP:
- printer(arg, "pap");
- break;
- case PPP_CHAP:
- printer(arg, "chap");
- if (p < optend) {
- switch (*p) {
- case CHAP_DIGEST_MD5:
- printer(arg, " MD5");
- ++p;
- break;
-#ifdef CHAPMS
- case CHAP_MICROSOFT:
- printer(arg, " m$oft");
- ++p;
- break;
-#endif
- }
- }
- break;
- default:
- printer(arg, "0x%x", cishort);
- }
- }
- break;
- case CI_QUALITY:
- if (olen >= CILEN_SHORT) {
- p += 2;
- printer(arg, "quality ");
- GETSHORT(cishort, p);
- switch (cishort) {
- case PPP_LQR:
- printer(arg, "lqr");
- break;
- default:
- printer(arg, "0x%x", cishort);
- }
- }
- break;
- case CI_CALLBACK:
- if (olen >= CILEN_CHAR) {
- p += 2;
- printer(arg, "callback ");
- GETCHAR(cishort, p);
- switch (cishort) {
- case CBCP_OPT:
- printer(arg, "CBCP");
- break;
- default:
- printer(arg, "0x%x", cishort);
- }
- }
- break;
- case CI_MAGICNUMBER:
- if (olen == CILEN_LONG) {
- p += 2;
- GETLONG(cilong, p);
- printer(arg, "magic 0x%x", cilong);
- }
- break;
- case CI_PCOMPRESSION:
- if (olen == CILEN_VOID) {
- p += 2;
- printer(arg, "pcomp");
- }
- break;
- case CI_ACCOMPRESSION:
- if (olen == CILEN_VOID) {
- p += 2;
- printer(arg, "accomp");
- }
- break;
- }
- while (p < optend) {
- GETCHAR(code, p);
- printer(arg, " %.2x", code);
- }
- printer(arg, ">");
- }
- break;
-
- case TERMACK:
- case TERMREQ:
- if (len > 0 && *p >= ' ' && *p < 0x7f) {
- printer(arg, " ");
- print_string(p, len, printer, arg);
- p += len;
- len = 0;
- }
- break;
-
- case ECHOREQ:
- case ECHOREP:
- case DISCREQ:
- if (len >= 4) {
- GETLONG(cilong, p);
- printer(arg, " magic=0x%x", cilong);
- p += 4;
- len -= 4;
- }
- break;
- }
-
- /* print the rest of the bytes in the packet */
- for (; len > 0; --len) {
- GETCHAR(code, p);
- printer(arg, " %.2x", code);
- }
-
- return p - pstart;
-}
-
-/*
- * Time to shut down the link because there is nothing out there.
- */
-
-static
-void LcpLinkFailure (f)
- fsm *f;
-{
- if (f->state == OPENED) {
- info("No response to %d echo-requests", lcp_echos_pending);
- notice("Serial link appears to be disconnected.");
- lcp_close(f->unit, "Peer not responding");
- pppd_status = EXIT_PEER_DEAD;
- }
-}
-
-/*
- * Timer expired for the LCP echo requests from this process.
- */
-
-static void
-LcpEchoCheck (f)
- fsm *f;
-{
- LcpSendEchoRequest (f);
- if (f->state != OPENED)
- return;
-
- /*
- * Start the timer for the next interval.
- */
- if (lcp_echo_timer_running)
- warn("assertion lcp_echo_timer_running==0 failed");
- TIMEOUT (LcpEchoTimeout, f, lcp_echo_interval);
- lcp_echo_timer_running = 1;
-}
-
-/*
- * LcpEchoTimeout - Timer expired on the LCP echo
- */
-
-static void
-LcpEchoTimeout (arg)
- void *arg;
-{
- if (lcp_echo_timer_running != 0) {
- lcp_echo_timer_running = 0;
- LcpEchoCheck ((fsm *) arg);
- }
-}
-
-/*
- * LcpEchoReply - LCP has received a reply to the echo
- */
-
-static void
-lcp_received_echo_reply (f, id, inp, len)
- fsm *f;
- int id;
- u_char *inp;
- int len;
-{
- u_int32_t magic;
-
- /* Check the magic number - don't count replies from ourselves. */
- if (len < 4) {
- dbglog("lcp: received short Echo-Reply, length %d", len);
- return;
- }
- GETLONG(magic, inp);
- if (lcp_gotoptions[f->unit].neg_magicnumber
- && magic == lcp_gotoptions[f->unit].magicnumber) {
- warn("appear to have received our own echo-reply!");
- return;
- }
-
- /* Reset the number of outstanding echo frames */
- lcp_echos_pending = 0;
-}
-
-/*
- * LcpSendEchoRequest - Send an echo request frame to the peer
- */
-
-static void
-LcpSendEchoRequest (f)
- fsm *f;
-{
- u_int32_t lcp_magic;
- u_char pkt[4], *pktp;
-
- /*
- * Detect the failure of the peer at this point.
- */
- if (lcp_echo_fails != 0) {
- if (lcp_echos_pending >= lcp_echo_fails) {
- LcpLinkFailure(f);
- lcp_echos_pending = 0;
- }
- }
-
- /*
- * Make and send the echo request frame.
- */
- if (f->state == OPENED) {
- lcp_magic = lcp_gotoptions[f->unit].magicnumber;
- pktp = pkt;
- PUTLONG(lcp_magic, pktp);
- fsm_sdata(f, ECHOREQ, lcp_echo_number++ & 0xFF, pkt, pktp - pkt);
- ++lcp_echos_pending;
- }
-}
-
-/*
- * lcp_echo_lowerup - Start the timer for the LCP frame
- */
-
-static void
-lcp_echo_lowerup (unit)
- int unit;
-{
- fsm *f = &lcp_fsm[unit];
-
- /* Clear the parameters for generating echo frames */
- lcp_echos_pending = 0;
- lcp_echo_number = 0;
- lcp_echo_timer_running = 0;
-
- /* If a timeout interval is specified then start the timer */
- if (lcp_echo_interval != 0)
- LcpEchoCheck (f);
-}
-
-/*
- * lcp_echo_lowerdown - Stop the timer for the LCP frame
- */
-
-static void
-lcp_echo_lowerdown (unit)
- int unit;
-{
- fsm *f = &lcp_fsm[unit];
-
- if (lcp_echo_timer_running != 0) {
- UNTIMEOUT (LcpEchoTimeout, f);
- lcp_echo_timer_running = 0;
- }
-}
diff --git a/c/src/libnetworking/pppd/lcp.h b/c/src/libnetworking/pppd/lcp.h
deleted file mode 100644
index 16ba4cc44b..0000000000
--- a/c/src/libnetworking/pppd/lcp.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * lcp.h - Link Control Protocol definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id$
- */
-
-/*
- * Options.
- */
-#define CI_MRU 1 /* Maximum Receive Unit */
-#define CI_ASYNCMAP 2 /* Async Control Character Map */
-#define CI_AUTHTYPE 3 /* Authentication Type */
-#define CI_QUALITY 4 /* Quality Protocol */
-#define CI_MAGICNUMBER 5 /* Magic Number */
-#define CI_PCOMPRESSION 7 /* Protocol Field Compression */
-#define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */
-#define CI_CALLBACK 13 /* callback */
-
-/*
- * LCP-specific packet types.
- */
-#define PROTREJ 8 /* Protocol Reject */
-#define ECHOREQ 9 /* Echo Request */
-#define ECHOREP 10 /* Echo Reply */
-#define DISCREQ 11 /* Discard Request */
-#define CBCP_OPT 6 /* Use callback control protocol */
-
-/*
- * The state of options is described by an lcp_options structure.
- */
-typedef struct lcp_options {
- bool passive; /* Don't die if we don't get a response */
- bool silent; /* Wait for the other end to start first */
- bool restart; /* Restart vs. exit after close */
- bool neg_mru; /* Negotiate the MRU? */
- bool neg_asyncmap; /* Negotiate the async map? */
- bool neg_upap; /* Ask for UPAP authentication? */
- bool neg_chap; /* Ask for CHAP authentication? */
- bool neg_magicnumber; /* Ask for magic number? */
- bool neg_pcompression; /* HDLC Protocol Field Compression? */
- bool neg_accompression; /* HDLC Address/Control Field Compression? */
- bool neg_lqr; /* Negotiate use of Link Quality Reports */
- bool neg_cbcp; /* Negotiate use of CBCP */
- int mru; /* Value of MRU */
- u_char chap_mdtype; /* which MD type (hashing algorithm) */
- u_int32_t asyncmap; /* Value of async map */
- u_int32_t magicnumber;
- int numloops; /* Number of loops during magic number neg. */
- u_int32_t lqr_period; /* Reporting period for LQR 1/100ths second */
-} lcp_options;
-
-extern fsm lcp_fsm[];
-extern lcp_options lcp_wantoptions[];
-extern lcp_options lcp_gotoptions[];
-extern lcp_options lcp_allowoptions[];
-extern lcp_options lcp_hisoptions[];
-extern u_int32_t xmit_accm[][8];
-
-#define DEFMRU 1500 /* Try for this */
-#define MINMRU 128 /* No MRUs below this */
-#define MAXMRU 16384 /* Normally limit MRU to this */
-
-void lcp_open __P((int));
-void lcp_close __P((int, char *));
-void lcp_lowerup __P((int));
-void lcp_lowerdown __P((int));
-void lcp_sprotrej __P((int, u_char *, int)); /* send protocol reject */
-
-extern struct protent lcp_protent;
-
-/* Default number of times we receive our magic number from the peer
- before deciding the link is looped-back. */
-#define DEFLOOPBACKFAIL 10
diff --git a/c/src/libnetworking/pppd/magic.c b/c/src/libnetworking/pppd/magic.c
deleted file mode 100644
index 3013e08f07..0000000000
--- a/c/src/libnetworking/pppd/magic.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * magic.c - PPP Magic Number routines.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#define RCSID "$Id$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/time.h>
-
-#include "pppd.h"
-#include "magic.h"
-
-static const char rcsid[] = RCSID;
-
-/*
- * magic_init - Initialize the magic number generator.
- *
- * Attempts to compute a random number seed which will not repeat.
- * The current method uses the current hostid, current process ID
- * and current time, currently.
- */
-void
-magic_init()
-{
- long seed;
- struct timeval t;
-
- gettimeofday(&t, NULL);
- seed = get_host_seed() ^ t.tv_sec ^ t.tv_usec ^ getpid();
- srand48(seed);
-}
-
-/*
- * magic - Returns the next magic number.
- */
-u_int32_t
-magic()
-{
- return (u_int32_t) mrand48();
-}
diff --git a/c/src/libnetworking/pppd/magic.h b/c/src/libnetworking/pppd/magic.h
deleted file mode 100644
index 1344626a38..0000000000
--- a/c/src/libnetworking/pppd/magic.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * magic.h - PPP Magic Number definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id$
- */
-
-void magic_init __P((void)); /* Initialize the magic number generator */
-u_int32_t magic __P((void)); /* Returns the next magic number */
diff --git a/c/src/libnetworking/pppd/md4.c b/c/src/libnetworking/pppd/md4.c
deleted file mode 100644
index cda9f943d0..0000000000
--- a/c/src/libnetworking/pppd/md4.c
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
-** ********************************************************************
-** md4.c -- Implementation of MD4 Message Digest Algorithm **
-** Updated: 2/16/90 by Ronald L. Rivest **
-** (C) 1990 RSA Data Security, Inc. **
-** ********************************************************************
-*/
-
-/*
-** To use MD4:
-** -- Include md4.h in your program
-** -- Declare an MDstruct MD to hold the state of the digest
-** computation.
-** -- Initialize MD using MDbegin(&MD)
-** -- For each full block (64 bytes) X you wish to process, call
-** MD4Update(&MD,X,512)
-** (512 is the number of bits in a full block.)
-** -- For the last block (less than 64 bytes) you wish to process,
-** MD4Update(&MD,X,n)
-** where n is the number of bits in the partial block. A partial
-** block terminates the computation, so every MD computation
-** should terminate by processing a partial block, even if it
-** has n = 0.
-** -- The message digest is available in MD.buffer[0] ...
-** MD.buffer[3]. (Least-significant byte of each word
-** should be output first.)
-** -- You can print out the digest using MDprint(&MD)
-*/
-
-/* Implementation notes:
-** This implementation assumes that ints are 32-bit quantities.
-*/
-
-#define TRUE 1
-#define FALSE 0
-
-/* Compile-time includes
-*/
-#include <stdio.h>
-#include "md4.h"
-#include "pppd.h"
-
-/* Compile-time declarations of MD4 "magic constants".
-*/
-#define I0 0x67452301 /* Initial values for MD buffer */
-#define I1 0xefcdab89
-#define I2 0x98badcfe
-#define I3 0x10325476
-#define C2 013240474631 /* round 2 constant = sqrt(2) in octal */
-#define C3 015666365641 /* round 3 constant = sqrt(3) in octal */
-/* C2 and C3 are from Knuth, The Art of Programming, Volume 2
-** (Seminumerical Algorithms), Second Edition (1981), Addison-Wesley.
-** Table 2, page 660.
-*/
-
-#define fs1 3 /* round 1 shift amounts */
-#define fs2 7
-#define fs3 11
-#define fs4 19
-#define gs1 3 /* round 2 shift amounts */
-#define gs2 5
-#define gs3 9
-#define gs4 13
-#define hs1 3 /* round 3 shift amounts */
-#define hs2 9
-#define hs3 11
-#define hs4 15
-
-/* Compile-time macro declarations for MD4.
-** Note: The "rot" operator uses the variable "tmp".
-** It assumes tmp is declared as unsigned int, so that the >>
-** operator will shift in zeros rather than extending the sign bit.
-*/
-#define f(X,Y,Z) ((X&Y) | ((~X)&Z))
-#define g(X,Y,Z) ((X&Y) | (X&Z) | (Y&Z))
-#define h(X,Y,Z) (X^Y^Z)
-#define rot(X,S) (tmp=X,(tmp<<S) | (tmp>>(32-S)))
-#define ff(A,B,C,D,i,s) A = rot((A + f(B,C,D) + X[i]),s)
-#define gg(A,B,C,D,i,s) A = rot((A + g(B,C,D) + X[i] + C2),s)
-#define hh(A,B,C,D,i,s) A = rot((A + h(B,C,D) + X[i] + C3),s)
-
-/* MD4print(MDp)
-** Print message digest buffer MDp as 32 hexadecimal digits.
-** Order is from low-order byte of buffer[0] to high-order byte of
-** buffer[3].
-** Each byte is printed with high-order hexadecimal digit first.
-** This is a user-callable routine.
-*/
-void
-MD4Print(MDp)
-MD4_CTX *MDp;
-{
- int i,j;
- for (i=0;i<4;i++)
- for (j=0;j<32;j=j+8)
- printf("%02x",(MDp->buffer[i]>>j) & 0xFF);
-}
-
-/* MD4Init(MDp)
-** Initialize message digest buffer MDp.
-** This is a user-callable routine.
-*/
-void
-MD4Init(MDp)
-MD4_CTX *MDp;
-{
- int i;
- MDp->buffer[0] = I0;
- MDp->buffer[1] = I1;
- MDp->buffer[2] = I2;
- MDp->buffer[3] = I3;
- for (i=0;i<8;i++) MDp->count[i] = 0;
- MDp->done = 0;
-}
-
-/* MDblock(MDp,X)
-** Update message digest buffer MDp->buffer using 16-word data block X.
-** Assumes all 16 words of X are full of data.
-** Does not update MDp->count.
-** This routine is not user-callable.
-*/
-static void
-MDblock(MDp,Xb)
-MD4_CTX *MDp;
-unsigned char *Xb;
-{
- register unsigned int tmp, A, B, C, D;
- unsigned int X[16];
- int i;
-
- for (i = 0; i < 16; ++i) {
- X[i] = Xb[0] + (Xb[1] << 8) + (Xb[2] << 16) + (Xb[3] << 24);
- Xb += 4;
- }
-
- A = MDp->buffer[0];
- B = MDp->buffer[1];
- C = MDp->buffer[2];
- D = MDp->buffer[3];
- /* Update the message digest buffer */
- ff(A , B , C , D , 0 , fs1); /* Round 1 */
- ff(D , A , B , C , 1 , fs2);
- ff(C , D , A , B , 2 , fs3);
- ff(B , C , D , A , 3 , fs4);
- ff(A , B , C , D , 4 , fs1);
- ff(D , A , B , C , 5 , fs2);
- ff(C , D , A , B , 6 , fs3);
- ff(B , C , D , A , 7 , fs4);
- ff(A , B , C , D , 8 , fs1);
- ff(D , A , B , C , 9 , fs2);
- ff(C , D , A , B , 10 , fs3);
- ff(B , C , D , A , 11 , fs4);
- ff(A , B , C , D , 12 , fs1);
- ff(D , A , B , C , 13 , fs2);
- ff(C , D , A , B , 14 , fs3);
- ff(B , C , D , A , 15 , fs4);
- gg(A , B , C , D , 0 , gs1); /* Round 2 */
- gg(D , A , B , C , 4 , gs2);
- gg(C , D , A , B , 8 , gs3);
- gg(B , C , D , A , 12 , gs4);
- gg(A , B , C , D , 1 , gs1);
- gg(D , A , B , C , 5 , gs2);
- gg(C , D , A , B , 9 , gs3);
- gg(B , C , D , A , 13 , gs4);
- gg(A , B , C , D , 2 , gs1);
- gg(D , A , B , C , 6 , gs2);
- gg(C , D , A , B , 10 , gs3);
- gg(B , C , D , A , 14 , gs4);
- gg(A , B , C , D , 3 , gs1);
- gg(D , A , B , C , 7 , gs2);
- gg(C , D , A , B , 11 , gs3);
- gg(B , C , D , A , 15 , gs4);
- hh(A , B , C , D , 0 , hs1); /* Round 3 */
- hh(D , A , B , C , 8 , hs2);
- hh(C , D , A , B , 4 , hs3);
- hh(B , C , D , A , 12 , hs4);
- hh(A , B , C , D , 2 , hs1);
- hh(D , A , B , C , 10 , hs2);
- hh(C , D , A , B , 6 , hs3);
- hh(B , C , D , A , 14 , hs4);
- hh(A , B , C , D , 1 , hs1);
- hh(D , A , B , C , 9 , hs2);
- hh(C , D , A , B , 5 , hs3);
- hh(B , C , D , A , 13 , hs4);
- hh(A , B , C , D , 3 , hs1);
- hh(D , A , B , C , 11 , hs2);
- hh(C , D , A , B , 7 , hs3);
- hh(B , C , D , A , 15 , hs4);
- MDp->buffer[0] += A;
- MDp->buffer[1] += B;
- MDp->buffer[2] += C;
- MDp->buffer[3] += D;
-}
-
-/* MD4Update(MDp,X,count)
-** Input: X -- a pointer to an array of unsigned characters.
-** count -- the number of bits of X to use.
-** (if not a multiple of 8, uses high bits of last byte.)
-** Update MDp using the number of bits of X given by count.
-** This is the basic input routine for an MD4 user.
-** The routine completes the MD computation when count < 512, so
-** every MD computation should end with one call to MD4Update with a
-** count less than 512. A call with count 0 will be ignored if the
-** MD has already been terminated (done != 0), so an extra call with
-** count 0 can be given as a "courtesy close" to force termination
-** if desired.
-*/
-void
-MD4Update(MDp,X,count)
-MD4_CTX *MDp;
-unsigned char *X;
-unsigned int count;
-{
- unsigned int i, tmp, bit, byte, mask;
- unsigned char XX[64];
- unsigned char *p;
-
- /* return with no error if this is a courtesy close with count
- ** zero and MDp->done is true.
- */
- if (count == 0 && MDp->done) return;
- /* check to see if MD is already done and report error */
- if (MDp->done)
- { printf("\nError: MD4Update MD already done."); return; }
-
- /* Add count to MDp->count */
- tmp = count;
- p = MDp->count;
- while (tmp)
- { tmp += *p;
- *p++ = tmp;
- tmp = tmp >> 8;
- }
-
- /* Process data */
- if (count == 512)
- { /* Full block of data to handle */
- MDblock(MDp,X);
- }
- else if (count > 512) /* Check for count too large */
- {
- printf("\nError: MD4Update called with illegal count value %d.",
- count);
- return;
- }
- else /* partial block -- must be last block so finish up */
- {
- /* Find out how many bytes and residual bits there are */
- byte = count >> 3;
- bit = count & 7;
- /* Copy X into XX since we need to modify it */
- for (i=0;i<=byte;i++) XX[i] = X[i];
- for (i=byte+1;i<64;i++) XX[i] = 0;
- /* Add padding '1' bit and low-order zeros in last byte */
- mask = 1 << (7 - bit);
- XX[byte] = (XX[byte] | mask) & ~( mask - 1);
- /* If room for bit count, finish up with this block */
- if (byte <= 55)
- {
- for (i=0;i<8;i++) XX[56+i] = MDp->count[i];
- MDblock(MDp,XX);
- }
- else /* need to do two blocks to finish up */
- {
- MDblock(MDp,XX);
- for (i=0;i<56;i++) XX[i] = 0;
- for (i=0;i<8;i++) XX[56+i] = MDp->count[i];
- MDblock(MDp,XX);
- }
- /* Set flag saying we're done with MD computation */
- MDp->done = 1;
- }
-}
-
-/*
-** Finish up MD4 computation and return message digest.
-*/
-void
-MD4Final(buf, MD)
-unsigned char *buf;
-MD4_CTX *MD;
-{
- int i, j;
- unsigned int w;
-
- MD4Update(MD, NULL, 0);
- for (i = 0; i < 4; ++i) {
- w = MD->buffer[i];
- for (j = 0; j < 4; ++j) {
- *buf++ = w;
- w >>= 8;
- }
- }
-}
-
-/*
-** End of md4.c
-****************************(cut)***********************************/
diff --git a/c/src/libnetworking/pppd/md4.h b/c/src/libnetworking/pppd/md4.h
deleted file mode 100644
index 80e8f9a2ac..0000000000
--- a/c/src/libnetworking/pppd/md4.h
+++ /dev/null
@@ -1,64 +0,0 @@
-
-/*
-** ********************************************************************
-** md4.h -- Header file for implementation of **
-** MD4 Message Digest Algorithm **
-** Updated: 2/13/90 by Ronald L. Rivest **
-** (C) 1990 RSA Data Security, Inc. **
-** ********************************************************************
-*/
-
-#ifndef __P
-# if defined(__STDC__) || defined(__GNUC__)
-# define __P(x) x
-# else
-# define __P(x) ()
-# endif
-#endif
-
-
-/* MDstruct is the data structure for a message digest computation.
-*/
-typedef struct {
- unsigned int buffer[4]; /* Holds 4-word result of MD computation */
- unsigned char count[8]; /* Number of bits processed so far */
- unsigned int done; /* Nonzero means MD computation finished */
-} MD4_CTX;
-
-/* MD4Init(MD4_CTX *)
-** Initialize the MD4_CTX prepatory to doing a message digest
-** computation.
-*/
-extern void MD4Init __P((MD4_CTX *MD));
-
-/* MD4Update(MD,X,count)
-** Input: X -- a pointer to an array of unsigned characters.
-** count -- the number of bits of X to use (an unsigned int).
-** Updates MD using the first "count" bits of X.
-** The array pointed to by X is not modified.
-** If count is not a multiple of 8, MD4Update uses high bits of
-** last byte.
-** This is the basic input routine for a user.
-** The routine terminates the MD computation when count < 512, so
-** every MD computation should end with one call to MD4Update with a
-** count less than 512. Zero is OK for a count.
-*/
-extern void MD4Update __P((MD4_CTX *MD, unsigned char *X, unsigned int count));
-
-/* MD4Print(MD)
-** Prints message digest buffer MD as 32 hexadecimal digits.
-** Order is from low-order byte of buffer[0] to high-order byte
-** of buffer[3].
-** Each byte is printed with high-order hexadecimal digit first.
-*/
-extern void MD4Print __P((MD4_CTX *));
-
-/* MD4Final(buf, MD)
-** Returns message digest from MD and terminates the message
-** digest computation.
-*/
-extern void MD4Final __P((unsigned char *, MD4_CTX *));
-
-/*
-** End of md4.h
-****************************(cut)***********************************/
diff --git a/c/src/libnetworking/pppd/md5.c b/c/src/libnetworking/pppd/md5.c
deleted file mode 100644
index 0c16b3e545..0000000000
--- a/c/src/libnetworking/pppd/md5.c
+++ /dev/null
@@ -1,308 +0,0 @@
-
-
-/*
- ***********************************************************************
- ** md5.c -- the source code for MD5 routines **
- ** RSA Data Security, Inc. MD5 Message-Digest Algorithm **
- ** Created: 2/17/90 RLR **
- ** Revised: 1/91 SRD,AJ,BSK,JT Reference C ver., 7/10 constant corr. **
- ***********************************************************************
- */
-
-/*
- ***********************************************************************
- ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **
- ** **
- ** License to copy and use this software is granted provided that **
- ** it is identified as the "RSA Data Security, Inc. MD5 Message- **
- ** Digest Algorithm" in all material mentioning or referencing this **
- ** software or this function. **
- ** **
- ** License is also granted to make and use derivative works **
- ** provided that such works are identified as "derived from the RSA **
- ** Data Security, Inc. MD5 Message-Digest Algorithm" in all **
- ** material mentioning or referencing the derived work. **
- ** **
- ** RSA Data Security, Inc. makes no representations concerning **
- ** either the merchantability of this software or the suitability **
- ** of this software for any particular purpose. It is provided "as **
- ** is" without express or implied warranty of any kind. **
- ** **
- ** These notices must be retained in any copies of any part of this **
- ** documentation and/or software. **
- ***********************************************************************
- */
-
-#include <string.h> /* memcpy */
-
-#include "md5.h"
-
-/*
- ***********************************************************************
- ** Message-digest routines: **
- ** To form the message digest for a message M **
- ** (1) Initialize a context buffer mdContext using MD5Init **
- ** (2) Call MD5Update on mdContext and M **
- ** (3) Call MD5Final on mdContext **
- ** The message digest is now in mdContext->digest[0...15] **
- ***********************************************************************
- */
-
-/* forward declaration */
-static void Transform ();
-
-static unsigned char PADDING[64] = {
- 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-/* F, G, H and I are basic MD5 functions */
-#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
-#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define I(x, y, z) ((y) ^ ((x) | (~z)))
-
-/* ROTATE_LEFT rotates x left n bits */
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */
-/* Rotation is separate from addition to prevent recomputation */
-#define FF(a, b, c, d, x, s, ac) \
- {(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define GG(a, b, c, d, x, s, ac) \
- {(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define HH(a, b, c, d, x, s, ac) \
- {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define II(a, b, c, d, x, s, ac) \
- {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-
-#ifdef __STDC__
-#define UL(x) x##U
-#else
-#define UL(x) x
-#endif
-
-/* The routine MD5Init initializes the message-digest context
- mdContext. All fields are set to zero.
- */
-void MD5Init (mdContext)
-MD5_CTX *mdContext;
-{
- mdContext->i[0] = mdContext->i[1] = (UINT4)0;
-
- /* Load magic initialization constants.
- */
- mdContext->buf[0] = (UINT4)0x67452301;
- mdContext->buf[1] = (UINT4)0xefcdab89;
- mdContext->buf[2] = (UINT4)0x98badcfe;
- mdContext->buf[3] = (UINT4)0x10325476;
-}
-
-/* The routine MD5Update updates the message-digest context to
- account for the presence of each of the characters inBuf[0..inLen-1]
- in the message whose digest is being computed.
- */
-void MD5Update (mdContext, inBuf, inLen)
-MD5_CTX *mdContext;
-unsigned char *inBuf;
-unsigned int inLen;
-{
- UINT4 in[16];
- int mdi;
- unsigned int i, ii;
-
- /* compute number of bytes mod 64 */
- mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
-
- /* update number of bits */
- if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0])
- mdContext->i[1]++;
- mdContext->i[0] += ((UINT4)inLen << 3);
- mdContext->i[1] += ((UINT4)inLen >> 29);
-
- while (inLen--) {
- /* add new character to buffer, increment mdi */
- mdContext->in[mdi++] = *inBuf++;
-
- /* transform if necessary */
- if (mdi == 0x40) {
- for (i = 0, ii = 0; i < 16; i++, ii += 4)
- in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
- (((UINT4)mdContext->in[ii+2]) << 16) |
- (((UINT4)mdContext->in[ii+1]) << 8) |
- ((UINT4)mdContext->in[ii]);
- Transform (mdContext->buf, in);
- mdi = 0;
- }
- }
-}
-
-/* The routine MD5Final terminates the message-digest computation and
- ends with the desired message digest in mdContext->digest[0...15].
- */
-void MD5Final (hash, mdContext)
-unsigned char hash[];
-MD5_CTX *mdContext;
-{
- UINT4 in[16];
- int mdi;
- unsigned int i, ii;
- unsigned int padLen;
-
- /* save number of bits */
- in[14] = mdContext->i[0];
- in[15] = mdContext->i[1];
-
- /* compute number of bytes mod 64 */
- mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
-
- /* pad out to 56 mod 64 */
- padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
- MD5Update (mdContext, PADDING, padLen);
-
- /* append length in bits and transform */
- for (i = 0, ii = 0; i < 14; i++, ii += 4)
- in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
- (((UINT4)mdContext->in[ii+2]) << 16) |
- (((UINT4)mdContext->in[ii+1]) << 8) |
- ((UINT4)mdContext->in[ii]);
- Transform (mdContext->buf, in);
-
- /* store buffer in digest */
- for (i = 0, ii = 0; i < 4; i++, ii += 4) {
- mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF);
- mdContext->digest[ii+1] =
- (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
- mdContext->digest[ii+2] =
- (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
- mdContext->digest[ii+3] =
- (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
- }
- memcpy(hash, mdContext->digest, 16);
-}
-
-/* Basic MD5 step. Transforms buf based on in.
- */
-static void Transform (buf, in)
-UINT4 *buf;
-UINT4 *in;
-{
- UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3];
-
- /* Round 1 */
-#define S11 7
-#define S12 12
-#define S13 17
-#define S14 22
- FF ( a, b, c, d, in[ 0], S11, UL(3614090360)); /* 1 */
- FF ( d, a, b, c, in[ 1], S12, UL(3905402710)); /* 2 */
- FF ( c, d, a, b, in[ 2], S13, UL( 606105819)); /* 3 */
- FF ( b, c, d, a, in[ 3], S14, UL(3250441966)); /* 4 */
- FF ( a, b, c, d, in[ 4], S11, UL(4118548399)); /* 5 */
- FF ( d, a, b, c, in[ 5], S12, UL(1200080426)); /* 6 */
- FF ( c, d, a, b, in[ 6], S13, UL(2821735955)); /* 7 */
- FF ( b, c, d, a, in[ 7], S14, UL(4249261313)); /* 8 */
- FF ( a, b, c, d, in[ 8], S11, UL(1770035416)); /* 9 */
- FF ( d, a, b, c, in[ 9], S12, UL(2336552879)); /* 10 */
- FF ( c, d, a, b, in[10], S13, UL(4294925233)); /* 11 */
- FF ( b, c, d, a, in[11], S14, UL(2304563134)); /* 12 */
- FF ( a, b, c, d, in[12], S11, UL(1804603682)); /* 13 */
- FF ( d, a, b, c, in[13], S12, UL(4254626195)); /* 14 */
- FF ( c, d, a, b, in[14], S13, UL(2792965006)); /* 15 */
- FF ( b, c, d, a, in[15], S14, UL(1236535329)); /* 16 */
-
- /* Round 2 */
-#define S21 5
-#define S22 9
-#define S23 14
-#define S24 20
- GG ( a, b, c, d, in[ 1], S21, UL(4129170786)); /* 17 */
- GG ( d, a, b, c, in[ 6], S22, UL(3225465664)); /* 18 */
- GG ( c, d, a, b, in[11], S23, UL( 643717713)); /* 19 */
- GG ( b, c, d, a, in[ 0], S24, UL(3921069994)); /* 20 */
- GG ( a, b, c, d, in[ 5], S21, UL(3593408605)); /* 21 */
- GG ( d, a, b, c, in[10], S22, UL( 38016083)); /* 22 */
- GG ( c, d, a, b, in[15], S23, UL(3634488961)); /* 23 */
- GG ( b, c, d, a, in[ 4], S24, UL(3889429448)); /* 24 */
- GG ( a, b, c, d, in[ 9], S21, UL( 568446438)); /* 25 */
- GG ( d, a, b, c, in[14], S22, UL(3275163606)); /* 26 */
- GG ( c, d, a, b, in[ 3], S23, UL(4107603335)); /* 27 */
- GG ( b, c, d, a, in[ 8], S24, UL(1163531501)); /* 28 */
- GG ( a, b, c, d, in[13], S21, UL(2850285829)); /* 29 */
- GG ( d, a, b, c, in[ 2], S22, UL(4243563512)); /* 30 */
- GG ( c, d, a, b, in[ 7], S23, UL(1735328473)); /* 31 */
- GG ( b, c, d, a, in[12], S24, UL(2368359562)); /* 32 */
-
- /* Round 3 */
-#define S31 4
-#define S32 11
-#define S33 16
-#define S34 23
- HH ( a, b, c, d, in[ 5], S31, UL(4294588738)); /* 33 */
- HH ( d, a, b, c, in[ 8], S32, UL(2272392833)); /* 34 */
- HH ( c, d, a, b, in[11], S33, UL(1839030562)); /* 35 */
- HH ( b, c, d, a, in[14], S34, UL(4259657740)); /* 36 */
- HH ( a, b, c, d, in[ 1], S31, UL(2763975236)); /* 37 */
- HH ( d, a, b, c, in[ 4], S32, UL(1272893353)); /* 38 */
- HH ( c, d, a, b, in[ 7], S33, UL(4139469664)); /* 39 */
- HH ( b, c, d, a, in[10], S34, UL(3200236656)); /* 40 */
- HH ( a, b, c, d, in[13], S31, UL( 681279174)); /* 41 */
- HH ( d, a, b, c, in[ 0], S32, UL(3936430074)); /* 42 */
- HH ( c, d, a, b, in[ 3], S33, UL(3572445317)); /* 43 */
- HH ( b, c, d, a, in[ 6], S34, UL( 76029189)); /* 44 */
- HH ( a, b, c, d, in[ 9], S31, UL(3654602809)); /* 45 */
- HH ( d, a, b, c, in[12], S32, UL(3873151461)); /* 46 */
- HH ( c, d, a, b, in[15], S33, UL( 530742520)); /* 47 */
- HH ( b, c, d, a, in[ 2], S34, UL(3299628645)); /* 48 */
-
- /* Round 4 */
-#define S41 6
-#define S42 10
-#define S43 15
-#define S44 21
- II ( a, b, c, d, in[ 0], S41, UL(4096336452)); /* 49 */
- II ( d, a, b, c, in[ 7], S42, UL(1126891415)); /* 50 */
- II ( c, d, a, b, in[14], S43, UL(2878612391)); /* 51 */
- II ( b, c, d, a, in[ 5], S44, UL(4237533241)); /* 52 */
- II ( a, b, c, d, in[12], S41, UL(1700485571)); /* 53 */
- II ( d, a, b, c, in[ 3], S42, UL(2399980690)); /* 54 */
- II ( c, d, a, b, in[10], S43, UL(4293915773)); /* 55 */
- II ( b, c, d, a, in[ 1], S44, UL(2240044497)); /* 56 */
- II ( a, b, c, d, in[ 8], S41, UL(1873313359)); /* 57 */
- II ( d, a, b, c, in[15], S42, UL(4264355552)); /* 58 */
- II ( c, d, a, b, in[ 6], S43, UL(2734768916)); /* 59 */
- II ( b, c, d, a, in[13], S44, UL(1309151649)); /* 60 */
- II ( a, b, c, d, in[ 4], S41, UL(4149444226)); /* 61 */
- II ( d, a, b, c, in[11], S42, UL(3174756917)); /* 62 */
- II ( c, d, a, b, in[ 2], S43, UL( 718787259)); /* 63 */
- II ( b, c, d, a, in[ 9], S44, UL(3951481745)); /* 64 */
-
- buf[0] += a;
- buf[1] += b;
- buf[2] += c;
- buf[3] += d;
-}
-
-/*
- ***********************************************************************
- ** End of md5.c **
- ******************************** (cut) ********************************
- */
diff --git a/c/src/libnetworking/pppd/md5.h b/c/src/libnetworking/pppd/md5.h
deleted file mode 100644
index 7492b2228e..0000000000
--- a/c/src/libnetworking/pppd/md5.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- ***********************************************************************
- ** md5.h -- header file for implementation of MD5 **
- ** RSA Data Security, Inc. MD5 Message-Digest Algorithm **
- ** Created: 2/17/90 RLR **
- ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version **
- ** Revised (for MD5): RLR 4/27/91 **
- ** -- G modified to have y&~z instead of y&z **
- ** -- FF, GG, HH modified to add in last register done **
- ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 **
- ** -- distinct additive constant for each step **
- ** -- round 4 added, working mod 7 **
- ***********************************************************************
- */
-
-/*
- ***********************************************************************
- ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **
- ** **
- ** License to copy and use this software is granted provided that **
- ** it is identified as the "RSA Data Security, Inc. MD5 Message- **
- ** Digest Algorithm" in all material mentioning or referencing this **
- ** software or this function. **
- ** **
- ** License is also granted to make and use derivative works **
- ** provided that such works are identified as "derived from the RSA **
- ** Data Security, Inc. MD5 Message-Digest Algorithm" in all **
- ** material mentioning or referencing the derived work. **
- ** **
- ** RSA Data Security, Inc. makes no representations concerning **
- ** either the merchantability of this software or the suitability **
- ** of this software for any particular purpose. It is provided "as **
- ** is" without express or implied warranty of any kind. **
- ** **
- ** These notices must be retained in any copies of any part of this **
- ** documentation and/or software. **
- ***********************************************************************
- */
-
-#ifndef __MD5_INCLUDE__
-
-/* typedef a 32-bit type */
-typedef unsigned int UINT4;
-
-/* Data structure for MD5 (Message-Digest) computation */
-typedef struct {
- UINT4 i[2]; /* number of _bits_ handled mod 2^64 */
- UINT4 buf[4]; /* scratch buffer */
- unsigned char in[64]; /* input buffer */
- unsigned char digest[16]; /* actual digest after MD5Final call */
-} MD5_CTX;
-
-void MD5Init ();
-void MD5Update ();
-void MD5Final ();
-
-#define __MD5_INCLUDE__
-#endif /* __MD5_INCLUDE__ */
diff --git a/c/src/libnetworking/pppd/options.c b/c/src/libnetworking/pppd/options.c
deleted file mode 100644
index fb686d94a6..0000000000
--- a/c/src/libnetworking/pppd/options.c
+++ /dev/null
@@ -1,1525 +0,0 @@
-/*
- * options.c - handles option processing for PPP.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#define RCSID "$Id$"
-
-#include <ctype.h>
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <termios.h>
-#include <string.h>
-#include <netdb.h>
-#include <pwd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#ifdef PLUGIN
-#include <dlfcn.h>
-#endif
-#ifdef PPP_FILTER
-#include <pcap.h>
-#include <pcap-int.h> /* XXX: To get struct pcap */
-#endif
-
-#include "pppd.h"
-#include "pathnames.h"
-#include "patchlevel.h"
-#include "fsm.h"
-#include "lcp.h"
-#include "ipcp.h"
-#include "upap.h"
-#include "chap.h"
-#include "ccp.h"
-
-#include <net/ppp-comp.h>
-
-#if defined(ultrix) || defined(NeXT)
-char *strdup __P((char *));
-#endif
-
-static const char rcsid[] = RCSID;
-
-/*
- * Option variables and default values.
- */
-#ifdef PPP_FILTER
-int dflag = 0; /* Tell libpcap we want debugging */
-#endif
-int debug = 0; /* Debug flag */
-int kdebugflag = 0; /* Tell kernel to print debug messages */
-int default_device = 1; /* Using /dev/tty or equivalent */
-char devnam[MAXPATHLEN]; /* Device name */
-int crtscts = 0; /* Use hardware flow control */
-bool modem = 1; /* Use modem control lines */
-int inspeed = 0; /* Input/Output speed requested */
-u_int32_t netmask = 0; /* IP netmask to set on interface */
-bool lockflag = 0; /* Create lock file to lock the serial dev */
-bool nodetach = 0; /* Don't detach from controlling tty */
-bool updetach = 0; /* Detach once link is up */
-char *initializer = NULL; /* Script to initialize physical link */
-char *connect_script = NULL; /* Script to establish physical link */
-char *disconnect_script = NULL; /* Script to disestablish physical link */
-char *welcomer = NULL; /* Script to run after phys link estab. */
-char *ptycommand = NULL; /* Command to run on other side of pty */
-int maxconnect = 0; /* Maximum connect time */
-char user[MAXNAMELEN]; /* Username for PAP */
-char passwd[MAXSECRETLEN]; /* Password for PAP */
-bool persist = 0; /* Reopen link after it goes down */
-char our_name[MAXNAMELEN]; /* Our name for authentication purposes */
-bool demand = 0; /* do dial-on-demand */
-char *ipparam = NULL; /* Extra parameter for ip up/down scripts */
-int idle_time_limit = 0; /* Disconnect if idle for this many seconds */
-int holdoff = 30; /* # seconds to pause before reconnecting */
-bool holdoff_specified; /* true if a holdoff value has been given */
-bool notty = 0; /* Stdin/out is not a tty */
-char *record_file = NULL; /* File to record chars sent/received */
-int using_pty = 0;
-bool sync_serial = 0; /* Device is synchronous serial device */
-int log_to_fd = 1; /* send log messages to this fd too */
-int maxfail = 10; /* max # of unsuccessful connection attempts */
-char linkname[MAXPATHLEN]; /* logical name for link */
-bool tune_kernel; /* may alter kernel settings */
-int connect_delay = 1000; /* wait this many ms after connect script */
-
-extern option_t auth_options[];
-extern struct stat devstat;
-extern int prepass; /* Doing pre-pass to find device name */
-
-struct option_info initializer_info;
-struct option_info connect_script_info;
-struct option_info disconnect_script_info;
-struct option_info welcomer_info;
-struct option_info devnam_info;
-struct option_info ptycommand_info;
-
-#ifdef PPP_FILTER
-struct bpf_program pass_filter;/* Filter program for packets to pass */
-struct bpf_program active_filter; /* Filter program for link-active pkts */
-pcap_t pc; /* Fake struct pcap so we can compile expr */
-#endif
-
-char *current_option; /* the name of the option being parsed */
-int privileged_option; /* set iff the current option came from root */
-char *option_source; /* string saying where the option came from */
-bool log_to_file; /* log_to_fd is a file opened by us */
-
-/*
- * Prototypes
- */
-static int setdevname __P((char *));
-static int setipaddr __P((char *));
-static int setspeed __P((char *));
-static int noopt __P((char **));
-static int setdomain __P((char **));
-static int setnetmask __P((char **));
-static int setxonxoff __P((char **));
-static int readfile __P((char **));
-static int callfile __P((char **));
-static void usage __P((void));
-static int setlogfile __P((char **));
-#ifdef PLUGIN
-static int loadplugin __P((char **));
-#endif
-
-#ifdef PPP_FILTER
-static int setpassfilter __P((char **));
-static int setactivefilter __P((char **));
-#endif
-
-static option_t *find_option __P((char *name));
-static int process_option __P((option_t *, char **));
-static int n_arguments __P((option_t *));
-static int number_option __P((char *, u_int32_t *, int));
-
-/*
- * Structure to store extra lists of options.
- */
-struct option_list {
- option_t *options;
- struct option_list *next;
-};
-
-static struct option_list *extra_options = NULL;
-
-/*
- * Valid arguments.
- */
-option_t general_options[] = {
- { "debug", o_int, &debug,
- "Increase debugging level", OPT_INC|OPT_NOARG|1 },
- { "-d", o_int, &debug,
- "Increase debugging level", OPT_INC|OPT_NOARG|1 },
- { "kdebug", o_int, &kdebugflag,
- "Set kernel driver debug level" },
- { "nodetach", o_bool, &nodetach,
- "Don't detach from controlling tty", 1 },
- { "-detach", o_bool, &nodetach,
- "Don't detach from controlling tty", 1 },
- { "updetach", o_bool, &updetach,
- "Detach from controlling tty once link is up", 1 },
- { "holdoff", o_int, &holdoff,
- "Set time in seconds before retrying connection" },
- { "idle", o_int, &idle_time_limit,
- "Set time in seconds before disconnecting idle link" },
- { "lock", o_bool, &lockflag,
- "Lock serial device with UUCP-style lock file", 1 },
- { "-all", o_special_noarg, noopt,
- "Don't request/allow any LCP or IPCP options (useless)" },
- { "init", o_string, &initializer,
- "A program to initialize the device",
- OPT_A2INFO | OPT_PRIVFIX, &initializer_info },
- { "connect", o_string, &connect_script,
- "A program to set up a connection",
- OPT_A2INFO | OPT_PRIVFIX, &connect_script_info },
- { "disconnect", o_string, &disconnect_script,
- "Program to disconnect serial device",
- OPT_A2INFO | OPT_PRIVFIX, &disconnect_script_info },
- { "welcome", o_string, &welcomer,
- "Script to welcome client",
- OPT_A2INFO | OPT_PRIVFIX, &welcomer_info },
- { "pty", o_string, &ptycommand,
- "Script to run on pseudo-tty master side",
- OPT_A2INFO | OPT_PRIVFIX | OPT_DEVNAM, &ptycommand_info },
- { "notty", o_bool, &notty,
- "Input/output is not a tty", OPT_DEVNAM | 1 },
- { "record", o_string, &record_file,
- "Record characters sent/received to file" },
- { "maxconnect", o_int, &maxconnect,
- "Set connection time limit", OPT_LLIMIT|OPT_NOINCR|OPT_ZEROINF },
- { "crtscts", o_int, &crtscts,
- "Set hardware (RTS/CTS) flow control", OPT_NOARG|OPT_VAL(1) },
- { "nocrtscts", o_int, &crtscts,
- "Disable hardware flow control", OPT_NOARG|OPT_VAL(-1) },
- { "-crtscts", o_int, &crtscts,
- "Disable hardware flow control", OPT_NOARG|OPT_VAL(-1) },
- { "cdtrcts", o_int, &crtscts,
- "Set alternate hardware (DTR/CTS) flow control", OPT_NOARG|OPT_VAL(2) },
- { "nocdtrcts", o_int, &crtscts,
- "Disable hardware flow control", OPT_NOARG|OPT_VAL(-1) },
- { "xonxoff", o_special_noarg, setxonxoff,
- "Set software (XON/XOFF) flow control" },
- { "domain", o_special, setdomain,
- "Add given domain name to hostname" },
- { "mtu", o_int, &lcp_allowoptions[0].mru,
- "Set our MTU", OPT_LIMITS, NULL, MAXMRU, MINMRU },
- { "netmask", o_special, setnetmask,
- "set netmask" },
- { "modem", o_bool, &modem,
- "Use modem control lines", 1 },
- { "local", o_bool, &modem,
- "Don't use modem control lines" },
- { "file", o_special, readfile,
- "Take options from a file", OPT_PREPASS },
- { "call", o_special, callfile,
- "Take options from a privileged file", OPT_PREPASS },
- { "persist", o_bool, &persist,
- "Keep on reopening connection after close", 1 },
- { "nopersist", o_bool, &persist,
- "Turn off persist option" },
- { "demand", o_bool, &demand,
- "Dial on demand", OPT_INITONLY | 1, &persist },
- { "sync", o_bool, &sync_serial,
- "Use synchronous HDLC serial encoding", 1 },
- { "logfd", o_int, &log_to_fd,
- "Send log messages to this file descriptor" },
- { "logfile", o_special, setlogfile,
- "Append log messages to this file" },
- { "nolog", o_int, &log_to_fd,
- "Don't send log messages to any file",
- OPT_NOARG | OPT_VAL(-1) },
- { "nologfd", o_int, &log_to_fd,
- "Don't send log messages to any file descriptor",
- OPT_NOARG | OPT_VAL(-1) },
- { "linkname", o_string, linkname,
- "Set logical name for link",
- OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
- { "maxfail", o_int, &maxfail,
- "Maximum number of unsuccessful connection attempts to allow" },
- { "ktune", o_bool, &tune_kernel,
- "Alter kernel settings as necessary", 1 },
- { "noktune", o_bool, &tune_kernel,
- "Don't alter kernel settings", 0 },
- { "connect-delay", o_int, &connect_delay,
- "Maximum time (in ms) to wait after connect script finishes" },
-#ifdef PLUGIN
- { "plugin", o_special, loadplugin,
- "Load a plug-in module into pppd", OPT_PRIV },
-#endif
-
-#ifdef PPP_FILTER
- { "pdebug", o_int, &dflag,
- "libpcap debugging" },
- { "pass-filter", 1, setpassfilter,
- "set filter for packets to pass" },
- { "active-filter", 1, setactivefilter,
- "set filter for active pkts" },
-#endif
-
- { NULL }
-};
-
-#ifndef IMPLEMENTATION
-#define IMPLEMENTATION ""
-#endif
-
-static char *usage_string = "\
-pppd version %s.%d%s\n\
-Usage: %s [ options ], where options are:\n\
- <device> Communicate over the named device\n\
- <speed> Set the baud rate to <speed>\n\
- <loc>:<rem> Set the local and/or remote interface IP\n\
- addresses. Either one may be omitted.\n\
- asyncmap <n> Set the desired async map to hex <n>\n\
- auth Require authentication from peer\n\
- connect <p> Invoke shell command <p> to set up the serial line\n\
- crtscts Use hardware RTS/CTS flow control\n\
- defaultroute Add default route through interface\n\
- file <f> Take options from file <f>\n\
- modem Use modem control lines\n\
- mru <n> Set MRU value to <n> for negotiation\n\
-See pppd(8) for more options.\n\
-";
-
-/*
- * parse_args - parse a string of arguments from the command line.
- * If prepass is true, we are scanning for the device name and only
- * processing a few options, so error messages are suppressed.
- */
-int
-parse_args(argc, argv)
- int argc;
- char **argv;
-{
- char *arg;
- option_t *opt;
- int ret;
-
- privileged_option = privileged;
- option_source = "command line";
- while (argc > 0) {
- arg = *argv++;
- --argc;
-
- /*
- * First see if it's an option in the new option list.
- */
- opt = find_option(arg);
- if (opt != NULL) {
- int n = n_arguments(opt);
- if (argc < n) {
- option_error("too few parameters for option %s", arg);
- return 0;
- }
- current_option = arg;
- if (!process_option(opt, argv))
- return 0;
- argc -= n;
- argv += n;
- continue;
- }
-
- /*
- * Maybe a tty name, speed or IP address?
- */
- if ((ret = setdevname(arg)) == 0
- && (ret = setspeed(arg)) == 0
- && (ret = setipaddr(arg)) == 0
- && !prepass) {
- option_error("unrecognized option '%s'", arg);
- usage();
- return 0;
- }
- if (ret < 0) /* error */
- return 0;
- }
- return 1;
-}
-
-#if 0
-/*
- * scan_args - scan the command line arguments to get the tty name,
- * if specified. Also checks whether the notty or pty option was given.
- */
-void
-scan_args(argc, argv)
- int argc;
- char **argv;
-{
- char *arg;
- option_t *opt;
-
- privileged_option = privileged;
- while (argc > 0) {
- arg = *argv++;
- --argc;
-
- if (strcmp(arg, "notty") == 0 || strcmp(arg, "pty") == 0)
- using_pty = 1;
-
- /* Skip options and their arguments */
- opt = find_option(arg);
- if (opt != NULL) {
- int n = n_arguments(opt);
- argc -= n;
- argv += n;
- continue;
- }
-
- /* Check if it's a tty name and copy it if so */
- (void) setdevname(arg, 1);
- }
-}
-#endif
-
-/*
- * options_from_file - Read a string of options from a file,
- * and interpret them.
- */
-int
-options_from_file(filename, must_exist, check_prot, priv)
- char *filename;
- int must_exist;
- int check_prot;
- int priv;
-{
- FILE *f;
- int i, newline, ret, err;
- option_t *opt;
- int oldpriv;
- char *oldsource;
- char *argv[MAXARGS];
- char args[MAXARGS][MAXWORDLEN];
- char cmd[MAXWORDLEN];
-
- f = fopen(filename, "r");
- err = errno;
- if (f == NULL) {
- if (!must_exist && err == ENOENT)
- return 1;
- errno = err;
- option_error("Can't open options file %s: %m", filename);
- return 0;
- }
-
- oldpriv = privileged_option;
- privileged_option = priv;
- oldsource = option_source;
- option_source = strdup(filename);
- if (option_source == NULL)
- option_source = "file";
- ret = 0;
- while (getword(f, cmd, &newline, filename)) {
- /*
- * First see if it's a command.
- */
- opt = find_option(cmd);
- if (opt != NULL) {
- int n = n_arguments(opt);
- for (i = 0; i < n; ++i) {
- if (!getword(f, args[i], &newline, filename)) {
- option_error(
- "In file %s: too few parameters for option '%s'",
- filename, cmd);
- goto err;
- }
- argv[i] = args[i];
- }
- current_option = cmd;
- if ((opt->flags & OPT_DEVEQUIV) && devnam_fixed) {
- option_error("the %s option may not be used in the %s file",
- cmd, filename);
- goto err;
- }
- if (!process_option(opt, argv))
- goto err;
- continue;
- }
-
- /*
- * Maybe a tty name, speed or IP address?
- */
- if ((i = setdevname(cmd)) == 0
- && (i = setspeed(cmd)) == 0
- && (i = setipaddr(cmd)) == 0) {
- option_error("In file %s: unrecognized option '%s'",
- filename, cmd);
- goto err;
- }
- if (i < 0) /* error */
- goto err;
- }
- ret = 1;
-
-err:
- fclose(f);
- privileged_option = oldpriv;
- option_source = oldsource;
- return ret;
-}
-
-/*
- * options_from_user - See if the use has a ~/.ppprc file,
- * and if so, interpret options from it.
- */
-int
-options_from_user()
-{
- return 0;
-}
-
-/*
- * options_for_tty - See if an options file exists for the serial
- * device, and if so, interpret options from it.
- */
-int
-options_for_tty()
-{
- char *dev, *path, *p;
- int ret;
- size_t pl;
-
- dev = devnam;
- if (strncmp(dev, "/dev/", 5) == 0)
- dev += 5;
- if (dev[0] == 0 || strcmp(dev, "tty") == 0)
- return 1; /* don't look for /etc/ppp/options.tty */
- pl = strlen(_PATH_TTYOPT) + strlen(dev) + 1;
- path = malloc(pl);
- if (path == NULL)
- novm("tty init file name");
- slprintf(path, pl, "%s%s", _PATH_TTYOPT, dev);
- /* Turn slashes into dots, for Solaris case (e.g. /dev/term/a) */
- for (p = path + strlen(_PATH_TTYOPT); *p != 0; ++p)
- if (*p == '/')
- *p = '.';
- ret = options_from_file(path, 0, 0, 1);
- free(path);
- return ret;
-}
-
-/*
- * options_from_list - process a string of options in a wordlist.
- */
-int
-options_from_list(w, priv)
- struct wordlist *w;
- int priv;
-{
- char *argv[MAXARGS];
- option_t *opt;
- int i, ret = 0;
-
- privileged_option = priv;
- option_source = "secrets file";
-
- while (w != NULL) {
- /*
- * First see if it's a command.
- */
- opt = find_option(w->word);
- if (opt != NULL) {
- int n = n_arguments(opt);
- struct wordlist *w0 = w;
- for (i = 0; i < n; ++i) {
- w = w->next;
- if (w == NULL) {
- option_error(
- "In secrets file: too few parameters for option '%s'",
- w0->word);
- goto err;
- }
- argv[i] = w->word;
- }
- current_option = w0->word;
- if (!process_option(opt, argv))
- goto err;
- w = w->next;
- continue;
- }
-
- /*
- * Maybe a tty name, speed or IP address?
- */
- if ((i = setdevname(w->word)) == 0
- && (i = setspeed(w->word)) == 0
- && (i = setipaddr(w->word)) == 0) {
- option_error("In secrets file: unrecognized option '%s'",
- w->word);
- goto err;
- }
- if (i < 0) /* error */
- goto err;
- w = w->next;
- }
- ret = 1;
-
-err:
- return ret;
-}
-
-/*
- * find_option - scan the option lists for the various protocols
- * looking for an entry with the given name.
- * This could be optimized by using a hash table.
- */
-static option_t *
-find_option(name)
- char *name;
-{
- option_t *opt;
- struct option_list *list;
- int i;
-
- for (list = extra_options; list != NULL; list = list->next)
- for (opt = list->options; opt->name != NULL; ++opt)
- if (strcmp(name, opt->name) == 0)
- return opt;
- for (opt = general_options; opt->name != NULL; ++opt)
- if (strcmp(name, opt->name) == 0)
- return opt;
- for (opt = auth_options; opt->name != NULL; ++opt)
- if (strcmp(name, opt->name) == 0)
- return opt;
- for (i = 0; protocols[i] != NULL; ++i)
- if ((opt = protocols[i]->options) != NULL)
- for (; opt->name != NULL; ++opt)
- if (strcmp(name, opt->name) == 0)
- return opt;
- return NULL;
-}
-
-/*
- * process_option - process one new-style option.
- */
-static int
-process_option(opt, argv)
- option_t *opt;
- char **argv;
-{
- u_int32_t v;
- int iv, a;
- char *sv;
- int (*parser) __P((char **));
-
- if ((opt->flags & OPT_PREPASS) == 0 && prepass)
- return 1;
- if ((opt->flags & OPT_INITONLY) && pppd_phase != PHASE_INITIALIZE) {
- option_error("it's too late to use the %s option", opt->name);
- return 0;
- }
- if ((opt->flags & OPT_PRIV) && !privileged_option) {
- option_error("using the %s option requires root privilege", opt->name);
- return 0;
- }
- if ((opt->flags & OPT_ENABLE) && *(bool *)(opt->addr2) == 0) {
- option_error("%s option is disabled", opt->name);
- return 0;
- }
- if ((opt->flags & OPT_PRIVFIX) && !privileged_option) {
- struct option_info *ip = (struct option_info *) opt->addr2;
- if (ip && ip->priv) {
- option_error("%s option cannot be overridden", opt->name);
- return 0;
- }
- }
-
- switch (opt->type) {
- case o_bool:
- v = opt->flags & OPT_VALUE;
- *(bool *)(opt->addr) = v;
- if (opt->addr2 && (opt->flags & OPT_A2COPY))
- *(bool *)(opt->addr2) = v;
- break;
-
- case o_int:
- iv = 0;
- if ((opt->flags & OPT_NOARG) == 0) {
- if (!int_option(*argv, &iv))
- return 0;
- if ((((opt->flags & OPT_LLIMIT) && iv < opt->lower_limit)
- || ((opt->flags & OPT_ULIMIT) && iv > opt->upper_limit))
- && !((opt->flags & OPT_ZEROOK && iv == 0))) {
- char *zok = (opt->flags & OPT_ZEROOK)? " zero or": "";
- switch (opt->flags & OPT_LIMITS) {
- case OPT_LLIMIT:
- option_error("%s value must be%s >= %d",
- opt->name, zok, opt->lower_limit);
- break;
- case OPT_ULIMIT:
- option_error("%s value must be%s <= %d",
- opt->name, zok, opt->upper_limit);
- break;
- case OPT_LIMITS:
- option_error("%s value must be%s between %d and %d",
- opt->name, opt->lower_limit, opt->upper_limit);
- break;
- }
- return 0;
- }
- }
- a = opt->flags & OPT_VALUE;
- if (a >= 128)
- a -= 256; /* sign extend */
- iv += a;
- if (opt->flags & OPT_INC)
- iv += *(int *)(opt->addr);
- if ((opt->flags & OPT_NOINCR) && !privileged_option) {
- int oldv = *(int *)(opt->addr);
- if ((opt->flags & OPT_ZEROINF) ?
- (oldv != 0 && (iv == 0 || iv > oldv)) : (iv > oldv)) {
- option_error("%s value cannot be increased", opt->name);
- return 0;
- }
- }
- *(int *)(opt->addr) = iv;
- if (opt->addr2 && (opt->flags & OPT_A2COPY))
- *(int *)(opt->addr2) = iv;
- break;
-
- case o_uint32:
- if (opt->flags & OPT_NOARG) {
- v = opt->flags & OPT_VALUE;
- } else if (!number_option(*argv, &v, 16))
- return 0;
- if (opt->flags & OPT_OR)
- v |= *(u_int32_t *)(opt->addr);
- *(u_int32_t *)(opt->addr) = v;
- if (opt->addr2 && (opt->flags & OPT_A2COPY))
- *(u_int32_t *)(opt->addr2) = v;
- break;
-
- case o_string:
- if (opt->flags & OPT_STATIC) {
- strlcpy((char *)(opt->addr), *argv, opt->upper_limit);
- } else {
- sv = strdup(*argv);
- if (sv == NULL)
- novm("option argument");
- if ( *(char **)(opt->addr) != NULL ) {
- free((void *)*(char **)(opt->addr));
- *(char **)(opt->addr) = NULL;
- }
- *(char **)(opt->addr) = sv;
- }
- break;
-
- case o_special_noarg:
- case o_special:
- parser = (int (*) __P((char **))) opt->addr;
- if (!(*parser)(argv))
- return 0;
- break;
- }
-
- if (opt->addr2) {
- if (opt->flags & OPT_A2INFO) {
- struct option_info *ip = (struct option_info *) opt->addr2;
- ip->priv = privileged_option;
- ip->source = option_source;
- } else if ((opt->flags & (OPT_A2COPY|OPT_ENABLE)) == 0)
- *(bool *)(opt->addr2) = 1;
- }
-
- return 1;
-}
-
-/*
- * n_arguments - tell how many arguments an option takes
- */
-static int
-n_arguments(opt)
- option_t *opt;
-{
- return (opt->type == o_bool || opt->type == o_special_noarg
- || (opt->flags & OPT_NOARG))? 0: 1;
-}
-
-/*
- * add_options - add a list of options to the set we grok.
- */
-void
-add_options(opt)
- option_t *opt;
-{
- struct option_list *list;
-
- list = malloc(sizeof(*list));
- if (list == 0)
- novm("option list entry");
- list->options = opt;
- list->next = extra_options;
- extra_options = list;
-}
-
-/*
- * usage - print out a message telling how to use the program.
- */
-static void
-usage()
-{
- if (pppd_phase == PHASE_INITIALIZE)
- fprintf(stderr, usage_string, VERSION, PATCHLEVEL, IMPLEMENTATION,
- "rtems_pppd");
-}
-
-/*
- * option_error - print a message about an error in an option.
- * The message is logged, and also sent to
- * stderr if pppd_phase == PHASE_INITIALIZE.
- */
-void
-option_error __V((char *fmt, ...))
-{
- va_list args;
- char buf[256];
-
-#if defined(__STDC__)
- va_start(args, fmt);
-#else
- char *fmt;
- va_start(args);
- fmt = va_arg(args, char *);
-#endif
- if (prepass) {
- va_end(args);
- return;
- }
- vslprintf(buf, sizeof(buf), fmt, args);
- va_end(args);
-
- fprintf(stderr, "pppd: %s\n", buf);
-}
-
-/*
- * Read a word from a file.
- * Words are delimited by white-space or by quotes (" or ').
- * Quotes, white-space and \ may be escaped with \.
- * \<newline> is ignored.
- */
-int
-getword(f, word, newlinep, filename)
- FILE *f;
- char *word;
- int *newlinep;
- char *filename;
-{
- int c, len, escape;
- int quoted, comment;
- int value, digit, got, n;
-
-#define isoctal(c) ((c) >= '0' && (c) < '8')
-
- *newlinep = 0;
- len = 0;
- escape = 0;
- comment = 0;
-
- /*
- * First skip white-space and comments.
- */
- for (;;) {
- c = getc(f);
- if (c == EOF)
- break;
-
- /*
- * A newline means the end of a comment; backslash-newline
- * is ignored. Note that we cannot have escape && comment.
- */
- if (c == '\n') {
- if (!escape) {
- *newlinep = 1;
- comment = 0;
- } else
- escape = 0;
- continue;
- }
-
- /*
- * Ignore characters other than newline in a comment.
- */
- if (comment)
- continue;
-
- /*
- * If this character is escaped, we have a word start.
- */
- if (escape)
- break;
-
- /*
- * If this is the escape character, look at the next character.
- */
- if (c == '\\') {
- escape = 1;
- continue;
- }
-
- /*
- * If this is the start of a comment, ignore the rest of the line.
- */
- if (c == '#') {
- comment = 1;
- continue;
- }
-
- /*
- * A non-whitespace character is the start of a word.
- */
- if (!isspace(c))
- break;
- }
-
- /*
- * Save the delimiter for quoted strings.
- */
- if (!escape && (c == '"' || c == '\'')) {
- quoted = c;
- c = getc(f);
- } else
- quoted = 0;
-
- /*
- * Process characters until the end of the word.
- */
- while (c != EOF) {
- if (escape) {
- /*
- * This character is escaped: backslash-newline is ignored,
- * various other characters indicate particular values
- * as for C backslash-escapes.
- */
- escape = 0;
- if (c == '\n') {
- c = getc(f);
- continue;
- }
-
- got = 0;
- switch (c) {
- case 'a':
- value = '\a';
- break;
- case 'b':
- value = '\b';
- break;
- case 'f':
- value = '\f';
- break;
- case 'n':
- value = '\n';
- break;
- case 'r':
- value = '\r';
- break;
- case 's':
- value = ' ';
- break;
- case 't':
- value = '\t';
- break;
-
- default:
- if (isoctal(c)) {
- /*
- * \ddd octal sequence
- */
- value = 0;
- for (n = 0; n < 3 && isoctal(c); ++n) {
- value = (value << 3) + (c & 07);
- c = getc(f);
- }
- got = 1;
- break;
- }
-
- if (c == 'x') {
- /*
- * \x<hex_string> sequence
- */
- value = 0;
- c = getc(f);
- for (n = 0; n < 2 && isxdigit(c); ++n) {
- digit = toupper(c) - '0';
- if (digit > 10)
- digit += '0' + 10 - 'A';
- value = (value << 4) + digit;
- c = getc (f);
- }
- got = 1;
- break;
- }
-
- /*
- * Otherwise the character stands for itself.
- */
- value = c;
- break;
- }
-
- /*
- * Store the resulting character for the escape sequence.
- */
- if (len < MAXWORDLEN-1)
- word[len] = value;
- ++len;
-
- if (!got)
- c = getc(f);
- continue;
-
- }
-
- /*
- * Not escaped: see if we've reached the end of the word.
- */
- if (quoted) {
- if (c == quoted)
- break;
- } else {
- if (isspace(c) || c == '#') {
- ungetc (c, f);
- break;
- }
- }
-
- /*
- * Backslash starts an escape sequence.
- */
- if (c == '\\') {
- escape = 1;
- c = getc(f);
- continue;
- }
-
- /*
- * An ordinary character: store it in the word and get another.
- */
- if (len < MAXWORDLEN-1)
- word[len] = c;
- ++len;
-
- c = getc(f);
- }
-
- /*
- * End of the word: check for errors.
- */
- if (c == EOF) {
- if (ferror(f)) {
- if (errno == 0)
- errno = EIO;
- option_error("Error reading %s: %m", filename);
- die(1);
- }
- /*
- * If len is zero, then we didn't find a word before the
- * end of the file.
- */
- if (len == 0)
- return 0;
- }
-
- /*
- * Warn if the word was too long, and append a terminating null.
- */
- if (len >= MAXWORDLEN) {
- option_error("warning: word in file %s too long (%.20s...)",
- filename, word);
- len = MAXWORDLEN - 1;
- }
- word[len] = 0;
-
- return 1;
-
-#undef isoctal
-
-}
-
-/*
- * number_option - parse an unsigned numeric parameter for an option.
- */
-static int
-number_option(str, valp, base)
- char *str;
- u_int32_t *valp;
- int base;
-{
- char *ptr;
-
- *valp = strtoul(str, &ptr, base);
- if (ptr == str) {
- option_error("invalid numeric parameter '%s' for %s option",
- str, current_option);
- return 0;
- }
- return 1;
-}
-
-
-/*
- * int_option - like number_option, but valp is int *,
- * the base is assumed to be 0, and *valp is not changed
- * if there is an error.
- */
-int
-int_option(str, valp)
- char *str;
- int *valp;
-{
- u_int32_t v;
-
- if (!number_option(str, &v, 0))
- return 0;
- *valp = (int) v;
- return 1;
-}
-
-
-/*
- * The following procedures parse options.
- */
-
-/*
- * readfile - take commands from a file.
- */
-static int
-readfile(argv)
- char **argv;
-{
- return options_from_file(*argv, 1, 1, privileged_option);
-}
-
-/*
- * callfile - take commands from /etc/ppp/peers/<name>.
- * Name may not contain /../, start with / or ../, or end in /..
- */
-static int
-callfile(argv)
- char **argv;
-{
- char *fname, *arg, *p;
- int l, ok;
-
- arg = *argv;
- ok = 1;
- if (arg[0] == '/' || arg[0] == 0)
- ok = 0;
- else {
- for (p = arg; *p != 0; ) {
- if (p[0] == '.' && p[1] == '.' && (p[2] == '/' || p[2] == 0)) {
- ok = 0;
- break;
- }
- while (*p != '/' && *p != 0)
- ++p;
- if (*p == '/')
- ++p;
- }
- }
- if (!ok) {
- option_error("call option value may not contain .. or start with /");
- return 0;
- }
-
- l = strlen(arg) + strlen(_PATH_PEERFILES) + 1;
- if ((fname = (char *) malloc(l)) == NULL)
- novm("call file name");
- slprintf(fname, l, "%s%s", _PATH_PEERFILES, arg);
-
- ok = options_from_file(fname, 1, 1, 1);
-
- free(fname);
- return ok;
-}
-
-#ifdef PPP_FILTER
-/*
- * setpdebug - Set libpcap debugging level.
- */
-static int
-setpdebug(argv)
- char **argv;
-{
- return int_option(*argv, &dflag);
-}
-
-/*
- * setpassfilter - Set the pass filter for packets
- */
-static int
-setpassfilter(argv)
- char **argv;
-{
- pc.linktype = DLT_PPP;
- pc.snapshot = PPP_HDRLEN;
-
- if (pcap_compile(&pc, &pass_filter, *argv, 1, netmask) == 0)
- return 1;
- option_error("error in pass-filter expression: %s\n", pcap_geterr(&pc));
- return 0;
-}
-
-/*
- * setactivefilter - Set the active filter for packets
- */
-static int
-setactivefilter(argv)
- char **argv;
-{
- pc.linktype = DLT_PPP;
- pc.snapshot = PPP_HDRLEN;
-
- if (pcap_compile(&pc, &active_filter, *argv, 1, netmask) == 0)
- return 1;
- option_error("error in active-filter expression: %s\n", pcap_geterr(&pc));
- return 0;
-}
-#endif
-
-/*
- * noopt - Disable all options.
- */
-static int
-noopt(argv)
- char **argv;
-{
- BZERO((char *) &lcp_wantoptions[0], sizeof (struct lcp_options));
- BZERO((char *) &lcp_allowoptions[0], sizeof (struct lcp_options));
- BZERO((char *) &ipcp_wantoptions[0], sizeof (struct ipcp_options));
- BZERO((char *) &ipcp_allowoptions[0], sizeof (struct ipcp_options));
-
- return (1);
-}
-
-/*
- * setdomain - Set domain name to append to hostname
- */
-static int
-setdomain(argv)
- char **argv;
-{
- if (!privileged_option) {
- option_error("using the domain option requires root privilege");
- return 0;
- }
- gethostname(hostname, MAXNAMELEN);
- if (**argv != 0) {
- if (**argv != '.')
- strncat(hostname, ".", MAXNAMELEN - strlen(hostname));
- strncat(hostname, *argv, MAXNAMELEN - strlen(hostname));
- }
- hostname[MAXNAMELEN-1] = 0;
- return (1);
-}
-
-
-/*
- * setspeed - Set the speed.
- */
-static int
-setspeed(arg)
- char *arg;
-{
- int spd;
- int ret = (int )1;
- speed_t spdValue = (speed_t)0;
- char *ptr;
-
- if ( !prepass ) {
- spd = strtol(arg, &ptr, 0);
- if (ptr == arg || *ptr != 0 || spd == 0) {
- ret = (int)0;
- }
- else {
- switch ( spd ) {
- case 2400:
- spdValue = B2400;
- break;
- case 4800:
- spdValue = B4800;
- break;
- case 9600:
- spdValue = B9600;
- break;
- case 19200:
- spdValue = B19200;
- break;
- case 38400:
- spdValue = B38400;
- break;
- case 57600:
- spdValue = B57600;
- break;
- case 115200:
- spdValue = B115200;
- break;
- default:
- ret = (int)0;
- break;
- }
-
- if ( spdValue ) {
- inspeed = spdValue;
- }
- }
- }
-
- return ( ret );
-}
-
-
-/*
- * setdevname - Set the device name.
- */
-static int
-setdevname(cp)
- char *cp;
-{
- struct stat statbuf;
- char dev[MAXPATHLEN];
-
- if (*cp == 0)
- return 0;
-
- if (strncmp("/dev/", cp, 5) != 0) {
- strlcpy(dev, "/dev/", sizeof(dev));
- strlcat(dev, cp, sizeof(dev));
- cp = dev;
- }
-
- /*
- * Check if there is a character device by this name.
- */
- if (stat(cp, &statbuf) < 0) {
- if (errno == ENOENT)
- return 0;
- option_error("Couldn't stat %s: %m", cp);
- return -1;
- }
- if (!S_ISCHR(statbuf.st_mode)) {
- option_error("%s is not a character device", cp);
- return -1;
- }
-
- if (pppd_phase != PHASE_INITIALIZE) {
- option_error("device name cannot be changed after initialization");
- return -1;
- } else if (devnam_fixed) {
- option_error("per-tty options file may not specify device name");
- return -1;
- }
-
- if (devnam_info.priv && !privileged_option) {
- option_error("device name cannot be overridden");
- return -1;
- }
-
- strlcpy(devnam, cp, sizeof(devnam));
- devstat = statbuf;
- default_device = 0;
- devnam_info.priv = privileged_option;
- devnam_info.source = option_source;
-
- return 1;
-}
-
-
-/*
- * setipaddr - Set the IP address
- */
-static int
-setipaddr(arg)
- char *arg;
-{
- struct hostent *hp;
- char *colon;
- u_int32_t local, remote;
- ipcp_options *wo = &ipcp_wantoptions[0];
-
- /*
- * IP address pair separated by ":".
- */
- if ((colon = strchr(arg, ':')) == NULL)
- return 0;
- if (prepass)
- return 1;
-
- /*
- * If colon first character, then no local addr.
- */
- if (colon != arg) {
- *colon = '\0';
- if ((local = inet_addr(arg)) == (u_int32_t) -1) {
- if ((hp = gethostbyname(arg)) == NULL) {
- option_error("unknown host: %s", arg);
- return -1;
- } else {
- local = *(u_int32_t *)hp->h_addr;
- }
- }
- if (bad_ip_adrs(local)) {
- option_error("bad local IP address %s", ip_ntoa(local));
- return -1;
- }
- if (local != 0)
- wo->ouraddr = local;
- *colon = ':';
- }
-
- /*
- * If colon last character, then no remote addr.
- */
- if (*++colon != '\0') {
- if ((remote = inet_addr(colon)) == (u_int32_t) -1) {
- if ((hp = gethostbyname(colon)) == NULL) {
- option_error("unknown host: %s", colon);
- return -1;
- } else {
- remote = *(u_int32_t *)hp->h_addr;
- if (remote_name[0] == 0)
- strlcpy(remote_name, colon, sizeof(remote_name));
- }
- }
- if (bad_ip_adrs(remote)) {
- option_error("bad remote IP address %s", ip_ntoa(remote));
- return -1;
- }
- if (remote != 0)
- wo->hisaddr = remote;
- }
-
- return 1;
-}
-
-
-/*
- * setnetmask - set the netmask to be used on the interface.
- */
-static int
-setnetmask(argv)
- char **argv;
-{
- u_int32_t mask, b;
- int n, ok;
- char *p, *endp;
-
- /*
- * Unfortunately, if we use inet_addr, we can't tell whether
- * a result of all 1s is an error or a valid 255.255.255.255.
- */
- p = *argv;
- ok = 0;
- mask = 0;
- for (n = 3;; --n) {
- b = strtoul(p, &endp, 0);
- if (endp == p)
- break;
- if (b > 255) {
- if (n == 3) {
- /* accept e.g. 0xffffff00 */
- p = endp;
- mask = b;
- }
- break;
- }
- mask |= b << (n * 8);
- p = endp;
- if (*p != '.' || n == 0)
- break;
- ++p;
- }
-
- mask = htonl(mask);
-
- if (*p != 0 || (netmask & ~mask) != 0) {
- option_error("invalid netmask value '%s'", *argv);
- return 0;
- }
-
- netmask = mask;
- return (1);
-}
-
-static int
-setxonxoff(argv)
- char **argv;
-{
- lcp_wantoptions[0].asyncmap |= 0x000A0000; /* escape ^S and ^Q */
- lcp_wantoptions[0].neg_asyncmap = 1;
-
- crtscts = -2;
- return (1);
-}
-
-static int
-setlogfile(argv)
- char **argv;
-{
- int fd, err;
-
- fd = open(*argv, O_WRONLY | O_APPEND | O_CREAT | O_EXCL, 0644);
- if (fd < 0 && errno == EEXIST)
- fd = open(*argv, O_WRONLY | O_APPEND);
- err = errno;
- if (fd < 0) {
- errno = err;
- option_error("Can't open log file %s: %m", *argv);
- return 0;
- }
- if (log_to_file && log_to_fd >= 0)
- close(log_to_fd);
- log_to_fd = fd;
- log_to_file = 1;
- return 1;
-}
-
-#ifdef PLUGIN
-static int
-loadplugin(argv)
- char **argv;
-{
- char *arg = *argv;
- void *handle;
- const char *err;
- void (*init) __P((void));
-
- handle = dlopen(arg, RTLD_GLOBAL | RTLD_NOW);
- if (handle == 0) {
- err = dlerror();
- if (err != 0)
- option_error("%s", err);
- option_error("Couldn't load plugin %s", arg);
- return 0;
- }
- init = dlsym(handle, "plugin_init");
- if (init == 0) {
- option_error("%s has no initialization entry point", arg);
- dlclose(handle);
- return 0;
- }
- info("Plugin %s loaded.", arg);
- (*init)();
- return 1;
-}
-#endif /* PLUGIN */
diff --git a/c/src/libnetworking/pppd/patchlevel.h b/c/src/libnetworking/pppd/patchlevel.h
deleted file mode 100644
index 54d88b8a66..0000000000
--- a/c/src/libnetworking/pppd/patchlevel.h
+++ /dev/null
@@ -1,6 +0,0 @@
-/* $Id$ */
-#define PATCHLEVEL 11
-
-#define VERSION "2.3"
-#define IMPLEMENTATION ""
-#define DATE "23 December 1999"
diff --git a/c/src/libnetworking/pppd/pathnames.h b/c/src/libnetworking/pppd/pathnames.h
deleted file mode 100644
index 0a4f6e69f2..0000000000
--- a/c/src/libnetworking/pppd/pathnames.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * define path names
- *
- * $Id$
- */
-
-#ifdef HAVE_PATHS_H
-#include <paths.h>
-
-#else
-#ifndef _PATH_VARRUN
-#define _PATH_VARRUN "/etc/ppp/"
-#endif
-#define _PATH_DEVNULL "/dev/null"
-#endif
-
-#ifndef _ROOT_PATH
-#define _ROOT_PATH
-#endif
-
-#define _PATH_UPAPFILE _ROOT_PATH "/etc/ppp/pap-secrets"
-#define _PATH_CHAPFILE _ROOT_PATH "/etc/ppp/chap-secrets"
-#define _PATH_SYSOPTIONS _ROOT_PATH "/etc/ppp/options"
-#define _PATH_IPUP _ROOT_PATH "/etc/ppp/ip-up"
-#define _PATH_IPDOWN _ROOT_PATH "/etc/ppp/ip-down"
-#define _PATH_AUTHUP _ROOT_PATH "/etc/ppp/auth-up"
-#define _PATH_AUTHDOWN _ROOT_PATH "/etc/ppp/auth-down"
-#define _PATH_TTYOPT _ROOT_PATH "/etc/ppp/options."
-#define _PATH_CONNERRS _ROOT_PATH "/etc/ppp/connect-errors"
-#define _PATH_PEERFILES _ROOT_PATH "/etc/ppp/peers/"
-#define _PATH_RESOLV _ROOT_PATH "/etc/ppp/resolv.conf"
-
-#define _PATH_USEROPT ".ppprc"
-
-#ifdef INET6
-#define _PATH_IPV6UP _ROOT_PATH "/etc/ppp/ipv6-up"
-#define _PATH_IPV6DOWN _ROOT_PATH "/etc/ppp/ipv6-down"
-#endif
-
-#ifdef IPX_CHANGE
-#define _PATH_IPXUP _ROOT_PATH "/etc/ppp/ipx-up"
-#define _PATH_IPXDOWN _ROOT_PATH "/etc/ppp/ipx-down"
-#endif /* IPX_CHANGE */
diff --git a/c/src/libnetworking/pppd/pppd.8 b/c/src/libnetworking/pppd/pppd.8
deleted file mode 100644
index 227345ff5f..0000000000
--- a/c/src/libnetworking/pppd/pppd.8
+++ /dev/null
@@ -1,1480 +0,0 @@
-.\" manual page [] for pppd 2.3
-.\" $Id$
-.\" SH section heading
-.\" SS subsection heading
-.\" LP paragraph
-.\" IP indented paragraph
-.\" TP hanging label
-.TH PPPD 8
-.SH NAME
-pppd \- Point to Point Protocol daemon
-.SH SYNOPSIS
-.B pppd
-[
-.I tty_name
-] [
-.I speed
-] [
-.I options
-]
-.SH DESCRIPTION
-.LP
-The Point-to-Point Protocol (PPP) provides a method for transmitting
-datagrams over serial point-to-point links. PPP
-is composed of three parts: a method for encapsulating datagrams over
-serial links, an extensible Link Control Protocol (LCP), and
-a family of Network Control Protocols (NCP) for establishing
-and configuring different network-layer protocols.
-.LP
-The encapsulation scheme is provided by driver code in the kernel.
-Pppd provides the basic LCP, authentication support, and an NCP for
-establishing and configuring the Internet Protocol (IP) (called the IP
-Control Protocol, IPCP).
-.SH FREQUENTLY USED OPTIONS
-.TP
-.I <tty_name>
-Communicate over the named device. The string "/dev/" is prepended if
-necessary. If no device name is given, or if the name of the terminal
-connected to the standard input is given, pppd will use that terminal,
-and will not fork to put itself in the background. A value for this
-option from a privileged source cannot be overridden by a
-non-privileged user.
-.TP
-.I <speed>
-Set the baud rate to <speed> (a decimal number). On systems such as
-4.4BSD and NetBSD, any speed can be specified. Other systems
-(e.g. SunOS) allow only a limited set of speeds.
-.TP
-.B asyncmap \fI<map>
-Set the async character map to <map>. This map describes which
-control characters cannot be successfully received over the serial
-line. Pppd will ask the peer to send these characters as a 2-byte
-escape sequence. The argument is a 32 bit hex number with each bit
-representing a character to escape. Bit 0 (00000001) represents the
-character 0x00; bit 31 (80000000) represents the character 0x1f or ^_.
-If multiple \fIasyncmap\fR options are given, the values are ORed
-together. If no \fIasyncmap\fR option is given, no async character
-map will be negotiated for the receive direction; the peer should then
-escape \fIall\fR control characters. To escape transmitted
-characters, use the \fIescape\fR option.
-.TP
-.B auth
-Require the peer to authenticate itself before allowing network
-packets to be sent or received. This option is the default if the
-system has a default route. If neither this option nor the
-\fInoauth\fR option is specified, pppd will only allow the peer to use
-IP addresses to which the system does not already have a route.
-.TP
-.B call \fIname
-Read options from the file /etc/ppp/peers/\fIname\fR. This file may
-contain privileged options, such as \fInoauth\fR, even if pppd
-is not being run by root. The \fIname\fR string may not begin with /
-or include .. as a pathname component. The format of the options file
-is described below.
-.TP
-.B connect \fIscript
-Use the executable or shell command specified by \fIscript\fR to set
-up the serial line. This script would typically use the chat(8)
-program to dial the modem and start the remote ppp session. A value
-for this option from a privileged source cannot be overridden by a
-non-privileged user.
-.TP
-.B crtscts
-Use hardware flow control (i.e. RTS/CTS) to control the flow of
-data on the serial port. If neither the \fIcrtscts\fR, the
-\fInocrtscts\fR, the \fIcdtrcts\fR nor the \fInocdtrcts\fR option
-is given, the hardware flow control setting for the serial port is
-left unchanged.
-Some serial ports (such as Macintosh serial ports) lack a true
-RTS output. Such serial ports use this mode to implement
-unidirectional flow control. The serial port will
-suspend transmission when requested by the modem (via CTS)
-but will be unable to request the modem stop sending to the
-computer. This mode retains the ability to use DTR as
-a modem control line.
-.TP
-.B defaultroute
-Add a default route to the system routing tables, using the peer as
-the gateway, when IPCP negotiation is successfully completed.
-This entry is removed when the PPP connection is broken. This option
-is privileged if the \fInodefaultroute\fR option has been specified.
-.TP
-.B disconnect \fIscript
-Run the executable or shell command specified by \fIscript\fR after
-pppd has terminated the link. This script could, for example, issue
-commands to the modem to cause it to hang up if hardware modem control
-signals were not available. The disconnect script is not run if the
-modem has already hung up. A value for this option from a privileged
-source cannot be overridden by a non-privileged user.
-.TP
-.B escape \fIxx,yy,...
-Specifies that certain characters should be escaped on transmission
-(regardless of whether the peer requests them to be escaped with its
-async control character map). The characters to be escaped are
-specified as a list of hex numbers separated by commas. Note that
-almost any character can be specified for the \fIescape\fR option,
-unlike the \fIasyncmap\fR option which only allows control characters
-to be specified. The characters which may not be escaped are those
-with hex values 0x20 - 0x3f or 0x5e.
-.TP
-.B file \fIname
-Read options from file \fIname\fR (the format is described below).
-The file must be readable by the user who has invoked pppd.
-.TP
-.B init \fIscript
-Run the executable or shell command specified by \fIscript\fR to
-initialize the serial line. This script would typically use the
-chat(8) program to configure the modem to enable auto answer. A value
-for this option from a privileged source cannot be overridden by a
-non-privileged user.
-.TP
-.B lock
-Specifies that pppd should create a UUCP-style lock file for the
-serial device to ensure exclusive access to the device.
-.TP
-.B mru \fIn
-Set the MRU [Maximum Receive Unit] value to \fIn\fR. Pppd
-will ask the peer to send packets of no more than \fIn\fR bytes. The
-minimum MRU value is 128. The default MRU value is 1500. A value of
-296 is recommended for slow links (40 bytes for TCP/IP header + 256
-bytes of data). (Note that for IPv6 MRU must be at least 1280)
-.TP
-.B mtu \fIn
-Set the MTU [Maximum Transmit Unit] value to \fIn\fR. Unless the
-peer requests a smaller value via MRU negotiation, pppd will
-request that the kernel networking code send data packets of no more
-than \fIn\fR bytes through the PPP network interface. (Note that for
-IPv6 MTU must be at least 1280)
-.TP
-.B passive
-Enables the "passive" option in the LCP. With this option, pppd will
-attempt to initiate a connection; if no reply is received from the
-peer, pppd will then just wait passively for a valid LCP packet from
-the peer, instead of exiting, as it would without this option.
-.SH OPTIONS
-.TP
-.I <local_IP_address>\fB:\fI<remote_IP_address>
-Set the local and/or remote interface IP addresses. Either one may be
-omitted. The IP addresses can be specified with a host name or in
-decimal dot notation (e.g. 150.234.56.78). The default local
-address is the (first) IP address of the system (unless the
-\fInoipdefault\fR
-option is given). The remote address will be obtained from the peer
-if not specified in any option. Thus, in simple cases, this option is
-not required. If a local and/or remote IP address is specified with
-this option, pppd
-will not accept a different value from the peer in the IPCP
-negotiation, unless the \fIipcp-accept-local\fR and/or
-\fIipcp-accept-remote\fR options are given, respectively.
-.TP
-.B ipv6 \fI<local_interface_identifier>\fR,\fI<remote_interface_identifier>
-Set the local and/or remote 64-bit interface identifier. Either one may be
-omitted. The identifier must be specified in standard ascii notation of
-IPv6 addresses (e.g. ::dead:beef). If the
-\fIipv6cp-use-ipaddr\fR
-option is given, the local identifier is the local IPv4 address (see above).
-On systems which supports a unique persistent id, such as EUI-48 derived
-from the Ethernet MAC address, \fIipv6cp-use-persistent\fR option can be
-used to replace the \fIipv6 <local>,<remote>\fR option. Otherwise the
-identifier is randomized.
-.TP
-.B active-filter \fIfilter-expression
-Specifies a packet filter to be applied to data packets to determine
-which packets are to be regarded as link activity, and therefore reset
-the idle timer, or cause the link to be brought up in demand-dialling
-mode. This option is useful in conjunction with the
-\fBidle\fR option if there are packets being sent or received
-regularly over the link (for example, routing information packets)
-which would otherwise prevent the link from ever appearing to be idle.
-The \fIfilter-expression\fR syntax is as described for tcpdump(1),
-except that qualifiers which are inappropriate for a PPP link, such as
-\fBether\fR and \fBarp\fR, are not permitted. Generally the filter
-expression should be enclosed in single-quotes to prevent whitespace
-in the expression from being interpreted by the shell. This option
-is currently only available under NetBSD, and then only
-if both the kernel and pppd were compiled with PPP_FILTER defined.
-.TP
-.B allow-ip \fIaddress(es)
-Allow peers to use the given IP address or subnet without
-authenticating themselves. The parameter is parsed as for each
-element of the list of allowed IP addresses in the secrets files (see
-the AUTHENTICATION section below).
-.TP
-.B bsdcomp \fInr,nt
-Request that the peer compress packets that it sends, using the
-BSD-Compress scheme, with a maximum code size of \fInr\fR bits, and
-agree to compress packets sent to the peer with a maximum code size of
-\fInt\fR bits. If \fInt\fR is not specified, it defaults to the value
-given for \fInr\fR. Values in the range 9 to 15 may be used for
-\fInr\fR and \fInt\fR; larger values give better compression but
-consume more kernel memory for compression dictionaries.
-Alternatively, a value of 0 for \fInr\fR or \fInt\fR disables
-compression in the corresponding direction. Use \fInobsdcomp\fR or
-\fIbsdcomp 0\fR to disable BSD-Compress compression entirely.
-.TP
-.B cdtrcts
-Use a non-standard hardware flow control (i.e. DTR/CTS) to control
-the flow of data on the serial port. If neither the \fIcrtscts\fR,
-the \fInocrtscts\fR, the \fIcdtrcts\fR nor the \fInocdtrcts\fR
-option is given, the hardware flow control setting for the serial
-port is left unchanged.
-Some serial ports (such as Macintosh serial ports) lack a true
-RTS output. Such serial ports use this mode to implement true
-bi-directional flow control. The sacrifice is that this flow
-control mode does not permit using DTR as a modem control line.
-.TP
-.B chap-interval \fIn
-If this option is given, pppd will rechallenge the peer every \fIn\fR
-seconds.
-.TP
-.B chap-max-challenge \fIn
-Set the maximum number of CHAP challenge transmissions to \fIn\fR
-(default 10).
-.TP
-.B chap-restart \fIn
-Set the CHAP restart interval (retransmission timeout for challenges)
-to \fIn\fR seconds (default 3).
-.TP
-.B connect-delay \fIn
-Wait for up \fIn\fR milliseconds after the connect script finishes for
-a valid PPP packet from the peer. At the end of this time, or when a
-valid PPP packet is received from the peer, pppd will commence
-negotiation by sending its first LCP packet. The default value is
-1000 (1 second). This wait period only applies if the \fBconnect\fR
-or \fBpty\fR option is used.
-.TP
-.B debug
-Enables connection debugging facilities.
-If this option is given, pppd will log the contents of all
-control packets sent or received in a readable form. The packets are
-logged through syslog with facility \fIdaemon\fR and level
-\fIdebug\fR. This information can be directed to a file by setting up
-/etc/syslog.conf appropriately (see syslog.conf(5)).
-.TP
-.B default-asyncmap
-Disable asyncmap negotiation, forcing all control characters to be
-escaped for both the transmit and the receive direction.
-.TP
-.B default-mru
-Disable MRU [Maximum Receive Unit] negotiation. With this option,
-pppd will use the default MRU value of 1500 bytes for both the
-transmit and receive direction.
-.TP
-.B deflate \fInr,nt
-Request that the peer compress packets that it sends, using the
-Deflate scheme, with a maximum window size of \fI2**nr\fR bytes, and
-agree to compress packets sent to the peer with a maximum window size
-of \fI2**nt\fR bytes. If \fInt\fR is not specified, it defaults to
-the value given for \fInr\fR. Values in the range 8 to 15 may be used
-for \fInr\fR and \fInt\fR; larger values give better compression but
-consume more kernel memory for compression dictionaries.
-Alternatively, a value of 0 for \fInr\fR or \fInt\fR disables
-compression in the corresponding direction. Use \fInodeflate\fR or
-\fIdeflate 0\fR to disable Deflate compression entirely. (Note: pppd
-requests Deflate compression in preference to BSD-Compress if the peer
-can do either.)
-.TP
-.B demand
-Initiate the link only on demand, i.e. when data traffic is present.
-With this option, the remote IP address must be specified by the user
-on the command line or in an options file. Pppd will initially
-configure the interface and enable it for IP traffic without
-connecting to the peer. When traffic is available, pppd will
-connect to the peer and perform negotiation, authentication, etc.
-When this is completed, pppd will commence passing data packets
-(i.e., IP packets) across the link.
-
-The \fIdemand\fR option implies the \fIpersist\fR option. If this
-behaviour is not desired, use the \fInopersist\fR option after the
-\fIdemand\fR option. The \fIidle\fR and \fIholdoff\fR
-options are also useful in conjuction with the \fIdemand\fR option.
-.TP
-.B domain \fId
-Append the domain name \fId\fR to the local host name for authentication
-purposes. For example, if gethostname() returns the name porsche, but
-the fully qualified domain name is porsche.Quotron.COM, you could
-specify \fIdomain Quotron.COM\fR. Pppd would then use the name
-\fIporsche.Quotron.COM\fR for looking up secrets in the secrets file,
-and as the default name to send to the peer when authenticating itself
-to the peer. This option is privileged.
-.TP
-.B hide-password
-When logging the contents of PAP packets, this option causes pppd to
-exclude the password string from the log. This is the default.
-.TP
-.B holdoff \fIn
-Specifies how many seconds to wait before re-initiating the link after
-it terminates. This option only has any effect if the \fIpersist\fR
-or \fIdemand\fR option is used. The holdoff period is not applied if
-the link was terminated because it was idle.
-.TP
-.B idle \fIn
-Specifies that pppd should disconnect if the link is idle for \fIn\fR
-seconds. The link is idle when no data packets (i.e. IP packets) are
-being sent or received. Note: it is not advisable to use this option
-with the \fIpersist\fR option without the \fIdemand\fR option.
-If the \fBactive-filter\fR
-option is given, data packets which are rejected by the specified
-activity filter also count as the link being idle.
-.TP
-.B ipcp-accept-local
-With this option, pppd will accept the peer's idea of our local IP
-address, even if the local IP address was specified in an option.
-.TP
-.B ipcp-accept-remote
-With this option, pppd will accept the peer's idea of its (remote) IP
-address, even if the remote IP address was specified in an option.
-.TP
-.B ipcp-max-configure \fIn
-Set the maximum number of IPCP configure-request transmissions to
-\fIn\fR (default 10).
-.TP
-.B ipcp-max-failure \fIn
-Set the maximum number of IPCP configure-NAKs returned before starting
-to send configure-Rejects instead to \fIn\fR (default 10).
-.TP
-.B ipcp-max-terminate \fIn
-Set the maximum number of IPCP terminate-request transmissions to
-\fIn\fR (default 3).
-.TP
-.B ipcp-restart \fIn
-Set the IPCP restart interval (retransmission timeout) to \fIn\fR
-seconds (default 3).
-.TP
-.B ipparam \fIstring
-Provides an extra parameter to the ip-up and ip-down scripts. If this
-option is given, the \fIstring\fR supplied is given as the 6th
-parameter to those scripts.
-.TP
-.B ipv6cp-max-configure \fIn
-Set the maximum number of IPv6CP configure-request transmissions to
-\fIn\fR (default 10).
-.TP
-.B ipv6cp-max-failure \fIn
-Set the maximum number of IPv6CP configure-NAKs returned before starting
-to send configure-Rejects instead to \fIn\fR (default 10).
-.TP
-.B ipv6cp-max-terminate \fIn
-Set the maximum number of IPv6CP terminate-request transmissions to
-\fIn\fR (default 3).
-.TP
-.B ipv6cp-restart \fIn
-Set the IPv6CP restart interval (retransmission timeout) to \fIn\fR
-seconds (default 3).
-.TP
-.B ipx
-Enable the IPXCP and IPX protocols. This option is presently only
-supported under Linux, and only if your kernel has been configured to
-include IPX support.
-.TP
-.B ipx-network \fIn
-Set the IPX network number in the IPXCP configure request frame to
-\fIn\fR, a hexadecimal number (without a leading 0x). There is no
-valid default. If this option is not specified, the network number is
-obtained from the peer. If the peer does not have the network number,
-the IPX protocol will not be started.
-.TP
-.B ipx-node \fIn\fB:\fIm
-Set the IPX node numbers. The two node numbers are separated from each
-other with a colon character. The first number \fIn\fR is the local
-node number. The second number \fIm\fR is the peer's node number. Each
-node number is a hexadecimal number, at most 10 digits long. The node
-numbers on the ipx-network must be unique. There is no valid
-default. If this option is not specified then the node numbers are
-obtained from the peer.
-.TP
-.B ipx-router-name \fI<string>
-Set the name of the router. This is a string and is sent to the peer
-as information data.
-.TP
-.B ipx-routing \fIn
-Set the routing protocol to be received by this option. More than one
-instance of \fIipx-routing\fR may be specified. The '\fInone\fR'
-option (0) may be specified as the only instance of ipx-routing. The
-values may be \fI0\fR for \fINONE\fR, \fI2\fR for \fIRIP/SAP\fR, and
-\fI4\fR for \fINLSP\fR.
-.TP
-.B ipxcp-accept-local
-Accept the peer's NAK for the node number specified in the ipx-node
-option. If a node number was specified, and non-zero, the default is
-to insist that the value be used. If you include this option then you
-will permit the peer to override the entry of the node number.
-.TP
-.B ipxcp-accept-network
-Accept the peer's NAK for the network number specified in the
-ipx-network option. If a network number was specified, and non-zero, the
-default is to insist that the value be used. If you include this
-option then you will permit the peer to override the entry of the node
-number.
-.TP
-.B ipxcp-accept-remote
-Use the peer's network number specified in the configure request
-frame. If a node number was specified for the peer and this option was
-not specified, the peer will be forced to use the value which you have
-specified.
-.TP
-.B ipxcp-max-configure \fIn
-Set the maximum number of IPXCP configure request frames which the
-system will send to \fIn\fR. The default is 10.
-.TP
-.B ipxcp-max-failure \fIn
-Set the maximum number of IPXCP NAK frames which the local system will
-send before it rejects the options. The default value is 3.
-.TP
-.B ipxcp-max-terminate \fIn
-Set the maximum nuber of IPXCP terminate request frames before the
-local system considers that the peer is not listening to them. The
-default value is 3.
-.TP
-.B kdebug \fIn
-Enable debugging code in the kernel-level PPP driver. The argument
-\fIn\fR is a number which is the sum of the following values: 1 to
-enable general debug messages, 2 to request that the contents of
-received packets be printed, and 4 to request that the contents of
-transmitted packets be printed. On most systems, messages printed by
-the kernel are logged by syslog(1) to a file as directed in the
-/etc/syslog.conf configuration file.
-.TP
-.B ktune
-Enables pppd to alter kernel settings as appropriate. Under Linux,
-pppd will enable IP forwarding (i.e. set /proc/sys/net/ipv4/ip_forward
-to 1) if the \fIproxyarp\fR option is used, and will enable the
-dynamic IP address option (i.e. set /proc/sys/net/ipv4/ip_dynaddr to
-1) in demand mode if the local address changes.
-.TP
-.B lcp-echo-failure \fIn
-If this option is given, pppd will presume the peer to be dead
-if \fIn\fR LCP echo-requests are sent without receiving a valid LCP
-echo-reply. If this happens, pppd will terminate the
-connection. Use of this option requires a non-zero value for the
-\fIlcp-echo-interval\fR parameter. This option can be used to enable
-pppd to terminate after the physical connection has been broken
-(e.g., the modem has hung up) in situations where no hardware modem
-control lines are available.
-.TP
-.B lcp-echo-interval \fIn
-If this option is given, pppd will send an LCP echo-request frame to
-the peer every \fIn\fR seconds. Normally the peer should respond to
-the echo-request by sending an echo-reply. This option can be used
-with the \fIlcp-echo-failure\fR option to detect that the peer is no
-longer connected.
-.TP
-.B lcp-max-configure \fIn
-Set the maximum number of LCP configure-request transmissions to
-\fIn\fR (default 10).
-.TP
-.B lcp-max-failure \fIn
-Set the maximum number of LCP configure-NAKs returned before starting
-to send configure-Rejects instead to \fIn\fR (default 10).
-.TP
-.B lcp-max-terminate \fIn
-Set the maximum number of LCP terminate-request transmissions to
-\fIn\fR (default 3).
-.TP
-.B lcp-restart \fIn
-Set the LCP restart interval (retransmission timeout) to \fIn\fR
-seconds (default 3).
-.TP
-.B linkname \fIname\fR
-Sets the logical name of the link to \fIname\fR. Pppd will create a
-file named \fBppp-\fIname\fB.pid\fR in /var/run (or /etc/ppp on some
-systems) containing its process ID. This can be useful in determining
-which instance of pppd is responsible for the link to a given peer
-system. This is a privileged option.
-.TP
-.B local
-Don't use the modem control lines. With this option, pppd will ignore
-the state of the CD (Carrier Detect) signal from the modem and will
-not change the state of the DTR (Data Terminal Ready) signal.
-.TP
-.B logfd \fIn
-Send log messages to file descriptor \fIn\fR. Pppd will send log
-messages to at most one file or file descriptor (as well as sending
-the log messages to syslog), so this option and the \fBlogfile\fR
-option are mutually exclusive. The default is for pppd to send log
-messages to stdout (file descriptor 1), unless the serial port is
-already open on stdout.
-.TP
-.B logfile \fIfilename
-Append log messages to the file \fIfilename\fR (as well as sending the
-log messages to syslog). The file is opened with the privileges of
-the user who invoked pppd, in append mode.
-.TP
-.B login
-Use the system password database for authenticating the peer using
-PAP, and record the user in the system wtmp file. Note that the peer
-must have an entry in the /etc/ppp/pap-secrets file as well as the
-system password database to be allowed access.
-.TP
-.B maxconnect \fIn
-Terminate the connection when it has been available for network
-traffic for \fIn\fR seconds (i.e. \fIn\fR seconds after the first
-network control protocol comes up).
-.TP
-.B maxfail \fIn
-Terminate after \fIn\fR consecutive failed connection attempts. A
-value of 0 means no limit. The default value is 10.
-.TP
-.B modem
-Use the modem control lines. This option is the default. With this
-option, pppd will wait for the CD (Carrier Detect) signal from the
-modem to be asserted when opening the serial device (unless a connect
-script is specified), and it will drop the DTR (Data Terminal Ready)
-signal briefly when the connection is terminated and before executing
-the connect script. On Ultrix, this option implies hardware flow
-control, as for the \fIcrtscts\fR option.
-.TP
-.B ms-dns \fI<addr>
-If pppd is acting as a server for Microsoft Windows clients, this
-option allows pppd to supply one or two DNS (Domain Name Server)
-addresses to the clients. The first instance of this option specifies
-the primary DNS address; the second instance (if given) specifies the
-secondary DNS address. (This option was present in some older
-versions of pppd under the name \fBdns-addr\fR.)
-.TP
-.B ms-wins \fI<addr>
-If pppd is acting as a server for Microsoft Windows or "Samba"
-clients, this option allows pppd to supply one or two WINS (Windows
-Internet Name Services) server addresses to the clients. The first
-instance of this option specifies the primary WINS address; the second
-instance (if given) specifies the secondary WINS address.
-.TP
-.B name \fIname
-Set the name of the local system for authentication purposes to
-\fIname\fR. This is a privileged option. With this option, pppd will
-use lines in the secrets files which have \fIname\fR as the second
-field when looking for a secret to use in authenticating the peer. In
-addition, unless overridden with the \fIuser\fR option, \fIname\fR
-will be used as the name to send to the peer when authenticating the
-local system to the peer. (Note that pppd does not append the domain
-name to \fIname\fR.)
-.TP
-.B netmask \fIn
-Set the interface netmask to \fIn\fR, a 32 bit netmask in "decimal dot"
-notation (e.g. 255.255.255.0). If this option is given, the value
-specified is ORed with the default netmask. The default netmask is
-chosen based on the negotiated remote IP address; it is the
-appropriate network mask for the class of the remote IP address, ORed
-with the netmasks for any non point-to-point network interfaces in the
-system which are on the same network. (Note: on some platforms, pppd
-will always use 255.255.255.255 for the netmask, if that is the only
-appropriate value for a point-to-point interface.)
-.TP
-.B noaccomp
-Disable Address/Control compression in both directions (send and
-receive).
-.TP
-.B noauth
-Do not require the peer to authenticate itself. This option is
-privileged.
-.TP
-.B nobsdcomp
-Disables BSD-Compress compression; \fBpppd\fR will not request or
-agree to compress packets using the BSD-Compress scheme.
-.TP
-.B noccp
-Disable CCP (Compression Control Protocol) negotiation. This option
-should only be required if the peer is buggy and gets confused by
-requests from pppd for CCP negotiation.
-.TP
-.B nocrtscts
-Disable hardware flow control (i.e. RTS/CTS) on the serial port.
-If neither the \fIcrtscts\fR nor the \fInocrtscts\fR nor the
-\fIcdtrcts\fR nor the \fInodtrcts\fR option is given, the hardware
-flow control setting for the serial port is left unchanged.
-.TP
-.B nodtrcts
-This option is a synonym for \fInocrtscts\fR. Either of these options will
-disable both forms of hardware flow control.
-.TP
-.B nodefaultroute
-Disable the \fIdefaultroute\fR option. The system administrator who
-wishes to prevent users from creating default routes with pppd
-can do so by placing this option in the /etc/ppp/options file.
-.TP
-.B nodeflate
-Disables Deflate compression; pppd will not request or agree to
-compress packets using the Deflate scheme.
-.TP
-.B nodetach
-Don't detach from the controlling terminal. Without this option, if a
-serial device other than the terminal on the standard input is
-specified, pppd will fork to become a background process.
-.TP
-.B noip
-Disable IPCP negotiation and IP communication. This option should
-only be required if the peer is buggy and gets confused by requests
-from pppd for IPCP negotiation.
-.TP
-.B noipv6
-Disable IPv6CP negotiation and IPv6 communication. This option should
-only be required if the peer is buggy and gets confused by requests
-from pppd for IPv6CP negotiation.
-.TP
-.B noipdefault
-Disables the default behaviour when no local IP address is specified,
-which is to determine (if possible) the local IP address from the
-hostname. With this option, the peer will have to supply the local IP
-address during IPCP negotiation (unless it specified explicitly on the
-command line or in an options file).
-.TP
-.B noipx
-Disable the IPXCP and IPX protocols. This option should only be
-required if the peer is buggy and gets confused by requests from pppd
-for IPXCP negotiation.
-.TP
-.B noktune
-Opposite of the \fIktune\fR option; disables pppd from changing system
-settings.
-.TP
-.B nolog
-Do not send log messages to a file or file descriptor. This option
-cancels the \fBlogfd\fR and \fBlogfile\fR options.
-.B nomagic
-Disable magic number negotiation. With this option, pppd cannot
-detect a looped-back line. This option should only be needed if the
-peer is buggy.
-.TP
-.B nopcomp
-Disable protocol field compression negotiation in both the receive and
-the transmit direction.
-.TP
-.B nopersist
-Exit once a connection has been made and terminated. This is the
-default unless the \fIpersist\fR or \fIdemand\fR option has been
-specified.
-.TP
-.B nopredictor1
-Do not accept or agree to Predictor-1 compression.
-.TP
-.B noproxyarp
-Disable the \fIproxyarp\fR option. The system administrator who
-wishes to prevent users from creating proxy ARP entries with pppd can
-do so by placing this option in the /etc/ppp/options file.
-.TP
-.B notty
-Normally, pppd requires a terminal device. With this option, pppd
-will allocate itself a pseudo-tty master/slave pair and use the slave
-as its terminal device. Pppd will create a child process to act as a
-`character shunt' to transfer characters between the pseudo-tty master
-and its standard input and output. Thus pppd will transmit characters
-on its standard output and receive characters on its standard input
-even if they are not terminal devices. This option increases the
-latency and CPU overhead of transferring data over the ppp interface
-as all of the characters sent and received must flow through the
-character shunt process. An explicit device name may not be given if
-this option is used.
-.TP
-.B novj
-Disable Van Jacobson style TCP/IP header compression in both the
-transmit and the receive direction.
-.TP
-.B novjccomp
-Disable the connection-ID compression option in Van Jacobson style
-TCP/IP header compression. With this option, pppd will not omit the
-connection-ID byte from Van Jacobson compressed TCP/IP headers, nor
-ask the peer to do so.
-.TP
-.B papcrypt
-Indicates that all secrets in the /etc/ppp/pap-secrets file which are
-used for checking the identity of the peer are encrypted, and thus
-pppd should not accept a password which, before encryption, is
-identical to the secret from the /etc/ppp/pap-secrets file.
-.TP
-.B pap-max-authreq \fIn
-Set the maximum number of PAP authenticate-request transmissions to
-\fIn\fR (default 10).
-.TP
-.B pap-restart \fIn
-Set the PAP restart interval (retransmission timeout) to \fIn\fR
-seconds (default 3).
-.TP
-.B pap-timeout \fIn
-Set the maximum time that pppd will wait for the peer to authenticate
-itself with PAP to \fIn\fR seconds (0 means no limit).
-.TP
-.B pass-filter \fIfilter-expression
-Specifies a packet filter to applied to data packets being sent or
-received to determine which packets should be allowed to pass.
-Packets which are rejected by the filter are silently discarded. This
-option can be used to prevent specific network daemons (such as
-routed) using up link bandwidth, or to provide a basic firewall
-capability.
-The \fIfilter-expression\fR syntax is as described for tcpdump(1),
-except that qualifiers which are inappropriate for a PPP link, such as
-\fBether\fR and \fBarp\fR, are not permitted. Generally the filter
-expression should be enclosed in single-quotes to prevent whitespace
-in the expression from being interpreted by the shell. Note that it
-is possible to apply different constraints to incoming and outgoing
-packets using the \fBinbound\fR and \fBoutbound\fR qualifiers. This
-option is currently only available under NetBSD, and then only if both
-the kernel and pppd were compiled with PPP_FILTER defined.
-.TP
-.B persist
-Do not exit after a connection is terminated; instead try to reopen
-the connection.
-.TP
-.B plugin \fIfilename
-Load the shared library object file \fIfilename\fR as a plugin. This
-is a privileged option.
-.TP
-.B predictor1
-Request that the peer compress frames that it sends using Predictor-1
-compression, and agree to compress transmitted frames with Predictor-1
-if requested. This option has no effect unless the kernel driver
-supports Predictor-1 compression.
-.TP
-.B privgroup \fIgroup-name
-Allows members of group \fIgroup-name\fR to use privileged options.
-This is a privileged option. Use of this option requires care as
-there is no guarantee that members of \fIgroup-name\fR cannot use pppd
-to become root themselves. Consider it equivalent to putting the
-members of \fIgroup-name\fR in the kmem or disk group.
-.TP
-.B proxyarp
-Add an entry to this system's ARP [Address Resolution Protocol] table
-with the IP address of the peer and the Ethernet address of this
-system. This will have the effect of making the peer appear to other
-systems to be on the local ethernet.
-.TP
-.B pty \fIscript
-Specifies that the command \fIscript\fR is to be used to communicate
-rather than a specific terminal device. Pppd will allocate itself a
-pseudo-tty master/slave pair and use the slave as its terminal
-device. The \fIscript\fR will be run in a child process with the
-pseudo-tty master as its standard input and output. An explicit
-device name may not be given if this option is used. (Note: if the
-\fIrecord\fR option is used in conjuction with the \fIpty\fR option,
-the child process will have pipes on its standard input and output.)
-.TP
-.B receive-all
-With this option, pppd will accept all control characters from the
-peer, including those marked in the receive asyncmap. Without this
-option, pppd will discard those characters as specified in RFC1662.
-This option should only be needed if the peer is buggy.
-.TP
-.B record \fIfilename
-Specifies that pppd should record all characters sent and received to
-a file named \fIfilename\fR. This file is opened in append mode,
-using the user's user-ID and permissions. This option is implemented
-using a pseudo-tty and a process to transfer characters between the
-pseudo-tty and the real serial device, so it will increase the latency
-and CPU overhead of transferring data over the ppp interface. The
-characters are stored in a tagged format with timestamps, which can be
-displayed in readable form using the pppdump(8) program.
-.TP
-.B remotename \fIname
-Set the assumed name of the remote system for authentication purposes
-to \fIname\fR.
-.TP
-.B refuse-chap
-With this option, pppd will not agree to authenticate itself to the
-peer using CHAP.
-.TP
-.B refuse-pap
-With this option, pppd will not agree to authenticate itself to the
-peer using PAP.
-.TP
-.B require-chap
-Require the peer to authenticate itself using CHAP [Challenge
-Handshake Authentication Protocol] authentication.
-.TP
-.B require-pap
-Require the peer to authenticate itself using PAP [Password
-Authentication Protocol] authentication.
-.TP
-.B show-password
-When logging the contents of PAP packets, this option causes pppd to
-show the password string in the log message.
-.TP
-.B silent
-With this option, pppd will not transmit LCP packets to initiate a
-connection until a valid LCP packet is received from the peer (as for
-the `passive' option with ancient versions of pppd).
-.TP
-.B sync
-Use synchronous HDLC serial encoding instead of asynchronous.
-The device used by pppd with this option must have sync support.
-Currently supports Microgate SyncLink adapters
-under Linux and FreeBSD 2.2.8 and later.
-.TP
-.B updetach
-With this option, pppd will detach from its controlling terminal once
-it has successfully established the ppp connection (to the point where
-the first network control protocol, usually the IP control protocol,
-has come up).
-.TP
-.B usehostname
-Enforce the use of the hostname (with domain name appended, if given)
-as the name of the local system for authentication purposes (overrides
-the \fIname\fR option). This option is not normally needed since the
-\fIname\fR option is privileged.
-.TP
-.B usepeerdns
-Ask the peer for up to 2 DNS server addresses. The addresses supplied
-by the peer (if any) are passed to the /etc/ppp/ip-up script in the
-environment variables DNS1 and DNS2. In addition, pppd will create an
-/etc/ppp/resolv.conf file containing one or two nameserver lines with
-the address(es) supplied by the peer.
-.TP
-.B user \fIname
-Sets the name used for authenticating the local system to the peer to
-\fIname\fR.
-.TP
-.B vj-max-slots \fIn
-Sets the number of connection slots to be used by the Van Jacobson
-TCP/IP header compression and decompression code to \fIn\fR, which
-must be between 2 and 16 (inclusive).
-.TP
-.B welcome \fIscript
-Run the executable or shell command specified by \fIscript\fR before
-initiating PPP negotiation, after the connect script (if any) has
-completed. A value for this option from a privileged source cannot be
-overridden by a non-privileged user.
-.TP
-.B xonxoff
-Use software flow control (i.e. XON/XOFF) to control the flow of data on
-the serial port.
-.SH OPTIONS FILES
-Options can be taken from files as well as the command line. Pppd
-reads options from the files /etc/ppp/options, ~/.ppprc and
-/etc/ppp/options.\fIttyname\fR (in that order) before processing the
-options on the command line. (In fact, the command-line options are
-scanned to find the terminal name before the options.\fIttyname\fR
-file is read.) In forming the name of the options.\fIttyname\fR file,
-the initial /dev/ is removed from the terminal name, and any remaining
-/ characters are replaced with dots.
-.PP
-An options file is parsed into a series of words, delimited by
-whitespace. Whitespace can be included in a word by enclosing the
-word in double-quotes ("). A backslash (\\) quotes the following character.
-A hash (#) starts a comment, which continues until the end of the
-line. There is no restriction on using the \fIfile\fR or \fIcall\fR
-options within an options file.
-.SH SECURITY
-.I pppd
-provides system administrators with sufficient access control that PPP
-access to a server machine can be provided to legitimate users without
-fear of compromising the security of the server or the network it's
-on. This control is provided through restrictions on which IP
-addresses the peer may use, based on its authenticated identity (if
-any), and through restrictions on which options a non-privileged user
-may use. Several of pppd's options are privileged, in particular
-those which permit potentially insecure configurations; these options
-are only accepted in files which are under the control of the system
-administrator, or if pppd is being run by root.
-.PP
-The default behaviour of pppd is to allow an unauthenticated peer to
-use a given IP address only if the system does not already have a
-route to that IP address. For example, a system with a
-permanent connection to the wider internet will normally have a
-default route, and thus all peers will have to authenticate themselves
-in order to set up a connection. On such a system, the \fIauth\fR
-option is the default. On the other hand, a system where the
-PPP link is the only connection to the internet will not normally have
-a default route, so the peer will be able to use almost any IP address
-without authenticating itself.
-.PP
-As indicated above, some security-sensitive options are privileged,
-which means that they may not be used by an ordinary non-privileged
-user running a setuid-root pppd, either on the command line, in the
-user's ~/.ppprc file, or in an options file read using the \fIfile\fR
-option. Privileged options may be used in /etc/ppp/options file or in
-an options file read using the \fIcall\fR option. If pppd is being
-run by the root user, privileged options can be used without
-restriction.
-.PP
-When opening the device, pppd uses either the invoking user's user ID
-or the root UID (that is, 0), depending on whether the device name was
-specified by the user or the system administrator. If the device name
-comes from a privileged source, that is, /etc/ppp/options or an
-options file read using the \fIcall\fR option, pppd uses full root
-privileges when opening the device. Thus, by creating an appropriate
-file under /etc/ppp/peers, the system administrator can allow users to
-establish a ppp connection via a device which they would not normally
-have permission to access. Otherwise pppd uses the invoking user's
-real UID when opening the device.
-.SH AUTHENTICATION
-Authentication is the process whereby one peer convinces the other of
-its identity. This involves the first peer sending its name to the
-other, together with some kind of secret information which could only
-come from the genuine authorized user of that name. In such an
-exchange, we will call the first peer the "client" and the other the
-"server". The client has a name by which it identifies itself to the
-server, and the server also has a name by which it identifies itself
-to the client. Generally the genuine client shares some secret (or
-password) with the server, and authenticates itself by proving that it
-knows that secret. Very often, the names used for authentication
-correspond to the internet hostnames of the peers, but this is not
-essential.
-.LP
-At present, pppd supports two authentication protocols: the Password
-Authentication Protocol (PAP) and the Challenge Handshake
-Authentication Protocol (CHAP). PAP involves the client sending its
-name and a cleartext password to the server to authenticate itself.
-In contrast, the server initiates the CHAP authentication exchange by
-sending a challenge to the client (the challenge packet includes the
-server's name). The client must respond with a response which
-includes its name plus a hash value derived from the shared secret and
-the challenge, in order to prove that it knows the secret.
-.LP
-The PPP protocol, being symmetrical, allows both peers to require the
-other to authenticate itself. In that case, two separate and
-independent authentication exchanges will occur. The two exchanges
-could use different authentication protocols, and in principle,
-different names could be used in the two exchanges.
-.LP
-The default behaviour of pppd is to agree to authenticate if
-requested, and to not require authentication from the peer. However,
-pppd will not agree to authenticate itself with a particular protocol
-if it has no secrets which could be used to do so.
-.LP
-Pppd stores secrets for use in authentication in secrets
-files (/etc/ppp/pap-secrets for PAP, /etc/ppp/chap-secrets for CHAP).
-Both secrets files have the same format. The secrets files can
-contain secrets for pppd to use in authenticating itself to other
-systems, as well as secrets for pppd to use when authenticating other
-systems to itself.
-.LP
-Each line in a secrets file contains one secret. A given secret is
-specific to a particular combination of client and server - it can
-only be used by that client to authenticate itself to that server.
-Thus each line in a secrets file has at least 3 fields: the name of
-the client, the name of the server, and the secret. These fields may
-be followed by a list of the IP addresses that the specified client
-may use when connecting to the specified server.
-.LP
-A secrets file is parsed into words as for a options file, so the
-client name, server name and secrets fields must each be one word,
-with any embedded spaces or other special characters quoted or
-escaped. Note that case is significant in the client and server names
-and in the secret.
-.LP
-If the secret starts with an `@', what follows is assumed to be the
-name of a file from which to read the secret. A "*" as the client or
-server name matches any name. When selecting a secret, pppd takes the
-best match, i.e. the match with the fewest wildcards.
-.LP
-Any following words on the same line are taken to be a list of
-acceptable IP addresses for that client. If there are only 3 words on
-the line, or if the first word is "-", then all IP addresses are
-disallowed. To allow any address, use "*". A word starting with "!"
-indicates that the specified address is \fInot\fR acceptable. An
-address may be followed by "/" and a number \fIn\fR, to indicate a
-whole subnet, i.e. all addresses which have the same value in the most
-significant \fIn\fR bits. In this form, the address may be followed
-by a plus sign ("+") to indicate that one address from the subnet is
-authorized, based on the ppp network interface unit number in use.
-In this case, the host part of the address will be set to the unit
-number plus one.
-.LP
-Thus a secrets file contains both secrets for use in authenticating
-other hosts, plus secrets which we use for authenticating ourselves to
-others. When pppd is authenticating the peer (checking the peer's
-identity), it chooses a secret with the peer's name in the first
-field and the name of the local system in the second field. The
-name of the local system defaults to the hostname, with the domain
-name appended if the \fIdomain\fR option is used. This default can be
-overridden with the \fIname\fR option, except when the
-\fIusehostname\fR option is used.
-.LP
-When pppd is choosing a secret to use in authenticating itself to the
-peer, it first determines what name it is going to use to identify
-itself to the peer. This name can be specified by the user with the
-\fIuser\fR option. If this option is not used, the name defaults to
-the name of the local system, determined as described in the previous
-paragraph. Then pppd looks for a secret with this name in the first
-field and the peer's name in the second field. Pppd will know the
-name of the peer if CHAP authentication is being used, because the
-peer will have sent it in the challenge packet. However, if PAP is being
-used, pppd will have to determine the peer's name from the options
-specified by the user. The user can specify the peer's name directly
-with the \fIremotename\fR option. Otherwise, if the remote IP address
-was specified by a name (rather than in numeric form), that name will
-be used as the peer's name. Failing that, pppd will use the null
-string as the peer's name.
-.LP
-When authenticating the peer with PAP, the supplied password is first
-compared with the secret from the secrets file. If the password
-doesn't match the secret, the password is encrypted using crypt() and
-checked against the secret again. Thus secrets for authenticating the
-peer can be stored in encrypted form if desired. If the
-\fIpapcrypt\fR option is given, the first (unencrypted) comparison is
-omitted, for better security.
-.LP
-Furthermore, if the \fIlogin\fR option was specified, the username and
-password are also checked against the system password database. Thus,
-the system administrator can set up the pap-secrets file to allow PPP
-access only to certain users, and to restrict the set of IP addresses
-that each user can use. Typically, when using the \fIlogin\fR option,
-the secret in /etc/ppp/pap-secrets would be "", which will match any
-password supplied by the peer. This avoids the need to have the same
-secret in two places.
-.LP
-Authentication must be satisfactorily completed before IPCP (or any
-other Network Control Protocol) can be started. If the peer is
-required to authenticate itself, and fails to do so, pppd will
-terminated the link (by closing LCP). If IPCP negotiates an
-unacceptable IP address for the remote host, IPCP will be closed. IP
-packets can only be sent or received when IPCP is open.
-.LP
-In some cases it is desirable to allow some hosts which can't
-authenticate themselves to connect and use one of a restricted set of
-IP addresses, even when the local host generally requires
-authentication. If the peer refuses to authenticate itself when
-requested, pppd takes that as equivalent to authenticating with PAP
-using the empty string for the username and password. Thus, by adding
-a line to the pap-secrets file which specifies the empty string for
-the client and password, it is possible to allow restricted access to
-hosts which refuse to authenticate themselves.
-.SH ROUTING
-.LP
-When IPCP negotiation is completed successfully, pppd will inform the
-kernel of the local and remote IP addresses for the ppp interface.
-This is sufficient to create a host route to the remote end of the
-link, which will enable the peers to exchange IP packets.
-Communication with other machines generally requires further
-modification to routing tables and/or ARP (Address Resolution
-Protocol) tables. In most cases the \fIdefaultroute\fR and/or
-\fIproxyarp\fR options are sufficient for this, but in some cases
-further intervention is required. The /etc/ppp/ip-up script can be
-used for this.
-.LP
-Sometimes it is desirable to add a default route through the remote
-host, as in the case of a machine whose only connection to the
-Internet is through the ppp interface. The \fIdefaultroute\fR option
-causes pppd to create such a default route when IPCP comes up, and
-delete it when the link is terminated.
-.LP
-In some cases it is desirable to use proxy ARP, for example on a
-server machine connected to a LAN, in order to allow other hosts to
-communicate with the remote host. The \fIproxyarp\fR option causes
-pppd to look for a network interface on the same subnet as the remote
-host (an interface supporting broadcast and ARP, which is up and not a
-point-to-point or loopback interface). If found, pppd creates a
-permanent, published ARP entry with the IP address of the remote host
-and the hardware address of the network interface found.
-.LP
-When the \fIdemand\fR option is used, the interface IP addresses have
-already been set at the point when IPCP comes up. If pppd has not
-been able to negotiate the same addresses that it used to configure
-the interface (for example when the peer is an ISP that uses dynamic
-IP address assignment), pppd has to change the interface IP addresses
-to the negotiated addresses. This may disrupt existing connections,
-and the use of demand dialling with peers that do dynamic IP address
-assignment is not recommended.
-.SH EXAMPLES
-.LP
-The following examples assume that the /etc/ppp/options file contains
-the \fIauth\fR option (as in the default /etc/ppp/options file in the
-ppp distribution).
-.LP
-Probably the most common use of pppd is to dial out to an ISP. This
-can be done with a command such as
-.IP
-pppd call isp
-.LP
-where the /etc/ppp/peers/isp file is set up by the system
-administrator to contain something like this:
-.IP
-ttyS0 19200 crtscts
-.br
-connect '/usr/sbin/chat -v -f /etc/ppp/chat-isp'
-.br
-noauth
-.LP
-In this example, we are using chat to dial the ISP's modem and go
-through any logon sequence required. The /etc/ppp/chat-isp file
-contains the script used by chat; it could for example contain
-something like this:
-.IP
-ABORT "NO CARRIER"
-.br
-ABORT "NO DIALTONE"
-.br
-ABORT "ERROR"
-.br
-ABORT "NO ANSWER"
-.br
-ABORT "BUSY"
-.br
-ABORT "Username/Password Incorrect"
-.br
-"" "at"
-.br
-OK "at&d0&c1"
-.br
-OK "atdt2468135"
-.br
-"name:" "^Umyuserid"
-.br
-"word:" "\\qmypassword"
-.br
-"ispts" "\\q^Uppp"
-.br
-"~-^Uppp-~"
-.LP
-See the chat(8) man page for details of chat scripts.
-.LP
-Pppd can also be used to provide a dial-in ppp service for users. If
-the users already have login accounts, the simplest way to set up the
-ppp service is to let the users log in to their accounts and run pppd
-(installed setuid-root) with a command such as
-.IP
-pppd proxyarp
-.LP
-To allow a user to use the PPP facilities, you need to allocate an IP
-address for that user's machine and create an entry in
-/etc/ppp/pap-secrets or /etc/ppp/chap-secrets (depending on which
-authentication method the PPP implementation on the user's machine
-supports), so that the user's
-machine can authenticate itself. For example, if Joe has a machine
-called "joespc" which is to be allowed to dial in to the machine
-called "server" and use the IP address joespc.my.net, you would add an
-entry like this to /etc/ppp/pap-secrets or /etc/ppp/chap-secrets:
-.IP
-joespc server "joe's secret" joespc.my.net
-.LP
-Alternatively, you can create a username called (for example) "ppp",
-whose login shell is pppd and whose home directory is /etc/ppp.
-Options to be used when pppd is run this way can be put in
-/etc/ppp/.ppprc.
-.LP
-If your serial connection is any more complicated than a piece of
-wire, you may need to arrange for some control characters to be
-escaped. In particular, it is often useful to escape XON (^Q) and
-XOFF (^S), using \fIasyncmap a0000\fR. If the path includes a telnet,
-you probably should escape ^] as well (\fIasyncmap 200a0000\fR). If
-the path includes an rlogin, you will need to use the \fIescape ff\fR
-option on the end which is running the rlogin client, since many
-rlogin implementations are not transparent; they will remove the
-sequence [0xff, 0xff, 0x73, 0x73, followed by any 8 bytes] from the
-stream.
-.SH DIAGNOSTICS
-.LP
-Messages are sent to the syslog daemon using facility LOG_DAEMON.
-(This can be overriden by recompiling pppd with the macro
-LOG_PPP defined as the desired facility.) In order to see the error
-and debug messages, you will need to edit your /etc/syslog.conf file
-to direct the messages to the desired output device or file.
-.LP
-The \fIdebug\fR option causes the contents of all control packets sent
-or received to be logged, that is, all LCP, PAP, CHAP or IPCP packets.
-This can be useful if the PPP negotiation does not succeed or if
-authentication fails.
-If debugging is enabled at compile time, the \fIdebug\fR option also
-causes other debugging messages to be logged.
-.LP
-Debugging can also be enabled or disabled by sending a SIGUSR1 signal
-to the pppd process. This signal acts as a toggle.
-.SH EXIT STATUS
-The exit status of pppd is set to indicate whether any error was
-detected, or the reason for the link being terminated. The values
-used are:
-.TP
-.B 0
-Pppd has detached, or otherwise the connection was successfully
-established and terminated at the peer's request.
-.TP
-.B 1
-An immediately fatal error of some kind occurred, such as an essential
-system call failing, or running out of virtual memory.
-.TP
-.B 2
-An error was detected in processing the options given, such as two
-mutually exclusive options being used.
-.TP
-.B 3
-Pppd is not setuid-root and the invoking user is not root.
-.TP
-.B 4
-The kernel does not support PPP, for example, the PPP kernel driver is
-not included or cannot be loaded.
-.TP
-.B 5
-Pppd terminated because it was sent a SIGINT, SIGTERM or SIGHUP
-signal.
-.TP
-.B 6
-The serial port could not be locked.
-.TP
-.B 7
-The serial port could not be opened.
-.TP
-.B 8
-The connect script failed (returned a non-zero exit status).
-.TP
-.B 9
-The command specified as the argument to the \fIpty\fR option could
-not be run.
-.TP
-.B 10
-The PPP negotiation failed, that is, it didn't reach the point where
-at least one network protocol (e.g. IP) was running.
-.TP
-.B 11
-The peer system failed (or refused) to authenticate itself.
-.TP
-.B 12
-The link was established successfully and terminated because it was
-idle.
-.TP
-.B 13
-The link was established successfully and terminated because the
-connect time limit was reached.
-.TP
-.B 14
-Callback was negotiated and an incoming call should arrive shortly.
-.TP
-.B 15
-The link was terminated because the peer is not responding to echo
-requests.
-.TP
-.B 16
-The link was terminated by the modem hanging up.
-.TP
-.B 17
-The PPP negotiation failed because serial loopback was detected.
-.TP
-.B 18
-The init script failed (returned a non-zero exit status).
-.TP
-.B 19
-We failed to authenticate ourselves to the peer.
-.SH SCRIPTS
-Pppd invokes scripts at various stages in its processing which can be
-used to perform site-specific ancillary processing. These scripts are
-usually shell scripts, but could be executable code files instead.
-Pppd does not wait for the scripts to finish. The scripts are
-executed as root (with the real and effective user-id set to 0), so
-that they can do things such as update routing tables or run
-privileged daemons. Be careful that the contents of these scripts do
-not compromise your system's security. Pppd runs the scripts with
-standard input, output and error redirected to /dev/null, and with an
-environment that is empty except for some environment variables that
-give information about the link. The environment variables that pppd
-sets are:
-.TP
-.B DEVICE
-The name of the serial tty device being used.
-.TP
-.B IFNAME
-The name of the network interface being used.
-.TP
-.B IPLOCAL
-The IP address for the local end of the link. This is only set when
-IPCP has come up.
-.TP
-.B IPREMOTE
-The IP address for the remote end of the link. This is only set when
-IPCP has come up.
-.TP
-.B PEERNAME
-The authenticated name of the peer. This is only set if the peer
-authenticates itself.
-.TP
-.B SPEED
-The baud rate of the tty device.
-.TP
-.B ORIG_UID
-The real user-id of the user who invoked pppd.
-.TP
-.B PPPLOGNAME
-The username of the real user-id that invoked pppd. This is always set.
-.P
-For the ip-down and auth-down scripts, pppd also sets the following
-variables giving statistics for the connection:
-.TP
-.B CONNECT_TIME
-The number of seconds from when the PPP negotiation started until the
-connection was terminated.
-.TP
-.B BYTES_SENT
-The number of bytes sent (at the level of the serial port) during the
-connection.
-.TP
-.B BYTES_RCVD
-The number of bytes received (at the level of the serial port) during
-the connection.
-.TP
-.B LINKNAME
-The logical name of the link, set with the \fIlinkname\fR option.
-.P
-Pppd invokes the following scripts, if they exist. It is not an error
-if they don't exist.
-.TP
-.B /etc/ppp/auth-up
-A program or script which is executed after the remote system
-successfully authenticates itself. It is executed with the parameters
-.IP
-\fIinterface-name peer-name user-name tty-device speed\fR
-.IP
-Note that this script is not executed if the peer doesn't authenticate
-itself, for example when the \fInoauth\fR option is used.
-.TP
-.B /etc/ppp/auth-down
-A program or script which is executed when the link goes down, if
-/etc/ppp/auth-up was previously executed. It is executed in the same
-manner with the same parameters as /etc/ppp/auth-up.
-.TP
-.B /etc/ppp/ip-up
-A program or script which is executed when the link is available for
-sending and receiving IP packets (that is, IPCP has come up). It is
-executed with the parameters
-.IP
-\fIinterface-name tty-device speed local-IP-address
-remote-IP-address ipparam\fR
-.TP
-.B /etc/ppp/ip-down
-A program or script which is executed when the link is no longer
-available for sending and receiving IP packets. This script can be
-used for undoing the effects of the /etc/ppp/ip-up script. It is
-invoked in the same manner and with the same parameters as the ip-up
-script.
-.TP
-.B /etc/ppp/ipv6-up
-Like /etc/ppp/ip-up, except that it is executed when the link is available
-for sending and receiving IPv6 packets. It is executed with the parameters
-.IP
-\fIinterface-name tty-device speed local-link-local-address
-remote-link-local-address ipparam\fR
-.TP
-.B /etc/ppp/ipv6-down
-Similar to /etc/ppp/ip-down, but it is executed when IPv6 packets can no
-longer be transmitted on the link. It is executed with the same parameters
-as the ipv6-up script.
-.TP
-.B /etc/ppp/ipx-up
-A program or script which is executed when the link is available for
-sending and receiving IPX packets (that is, IPXCP has come up). It is
-executed with the parameters
-.IP
-\fIinterface-name tty-device speed network-number local-IPX-node-address
-remote-IPX-node-address local-IPX-routing-protocol remote-IPX-routing-protocol
-local-IPX-router-name remote-IPX-router-name ipparam pppd-pid\fR
-.IP
-The local-IPX-routing-protocol and remote-IPX-routing-protocol field
-may be one of the following:
-.IP
-NONE to indicate that there is no routing protocol
-.br
-RIP to indicate that RIP/SAP should be used
-.br
-NLSP to indicate that Novell NLSP should be used
-.br
-RIP NLSP to indicate that both RIP/SAP and NLSP should be used
-.TP
-.B /etc/ppp/ipx-down
-A program or script which is executed when the link is no longer
-available for sending and receiving IPX packets. This script can be
-used for undoing the effects of the /etc/ppp/ipx-up script. It is
-invoked in the same manner and with the same parameters as the ipx-up
-script.
-.SH FILES
-.TP
-.B /var/run/ppp\fIn\fB.pid \fR(BSD or Linux), \fB/etc/ppp/ppp\fIn\fB.pid \fR(others)
-Process-ID for pppd process on ppp interface unit \fIn\fR.
-.TP
-.B /var/run/ppp-\fIname\fB.pid \fR(BSD or Linux), \fB/etc/ppp/ppp-\fIname\fB.pid \fR(others)
-Process-ID for pppd process for logical link \fIname\fR (see the
-\fIlinkname\fR option).
-.TP
-.B /etc/ppp/pap-secrets
-Usernames, passwords and IP addresses for PAP authentication. This
-file should be owned by root and not readable or writable by any other
-user. Pppd will log a warning if this is not the case.
-.TP
-.B /etc/ppp/chap-secrets
-Names, secrets and IP addresses for CHAP authentication. As for
-/etc/ppp/pap-secrets, this file should be owned by root and not
-readable or writable by any other user. Pppd will log a warning if
-this is not the case.
-.TP
-.B /etc/ppp/options
-System default options for pppd, read before user default options or
-command-line options.
-.TP
-.B ~/.ppprc
-User default options, read before /etc/ppp/options.\fIttyname\fR.
-.TP
-.B /etc/ppp/options.\fIttyname
-System default options for the serial port being used, read after
-~/.ppprc. In forming the \fIttyname\fR part of this
-filename, an initial /dev/ is stripped from the port name (if
-present), and any slashes in the remaining part are converted to
-dots.
-.TP
-.B /etc/ppp/peers
-A directory containing options files which may contain privileged
-options, even if pppd was invoked by a user other than root. The
-system administrator can create options files in this directory to
-permit non-privileged users to dial out without requiring the peer to
-authenticate, but only to certain trusted peers.
-.SH SEE ALSO
-.TP
-.B RFC1144
-Jacobson, V.
-\fICompressing TCP/IP headers for low-speed serial links.\fR
-February 1990.
-.TP
-.B RFC1321
-Rivest, R.
-.I The MD5 Message-Digest Algorithm.
-April 1992.
-.TP
-.B RFC1332
-McGregor, G.
-.I PPP Internet Protocol Control Protocol (IPCP).
-May 1992.
-.TP
-.B RFC1334
-Lloyd, B.; Simpson, W.A.
-.I PPP authentication protocols.
-October 1992.
-.TP
-.B RFC1661
-Simpson, W.A.
-.I The Point\-to\-Point Protocol (PPP).
-July 1994.
-.TP
-.B RFC1662
-Simpson, W.A.
-.I PPP in HDLC-like Framing.
-July 1994.
-.TP
-.B RFC2472
-Haskin, D.
-.I IP Version 6 over PPP
-December 1998.
-.SH NOTES
-The following signals have the specified effect when sent to pppd.
-.TP
-.B SIGINT, SIGTERM
-These signals cause pppd to terminate the link (by closing LCP),
-restore the serial device settings, and exit.
-.TP
-.B SIGHUP
-This signal causes pppd to terminate the link, restore the serial
-device settings, and close the serial device. If the \fIpersist\fR or
-\fIdemand\fR option has been specified, pppd will try to reopen the
-serial device and start another connection (after the holdoff period).
-Otherwise pppd will exit. If this signal is received during the
-holdoff period, it causes pppd to end the holdoff period immediately.
-.TP
-.B SIGUSR1
-This signal toggles the state of the \fIdebug\fR option.
-.TP
-.B SIGUSR2
-This signal causes pppd to renegotiate compression. This can be
-useful to re-enable compression after it has been disabled as a result
-of a fatal decompression error. (Fatal decompression errors generally
-indicate a bug in one or other implementation.)
-
-.SH AUTHORS
-Paul Mackerras (Paul.Mackerras@cs.anu.edu.au), based on earlier work by
-Drew Perkins,
-Brad Clements,
-Karl Fox,
-Greg Christy,
-and
-Brad Parker.
diff --git a/c/src/libnetworking/pppd/pppd.h b/c/src/libnetworking/pppd/pppd.h
deleted file mode 100644
index ddc5571b23..0000000000
--- a/c/src/libnetworking/pppd/pppd.h
+++ /dev/null
@@ -1,663 +0,0 @@
-/*
- * pppd.h - PPP daemon global declarations.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id$
- */
-
-#ifndef __PPPD_H__
-#define __PPPD_H__
-
-#include <stdio.h> /* for FILE */
-#include <limits.h> /* for NGROUPS_MAX */
-#include <sys/param.h> /* for MAXPATHLEN and BSD4_4, if defined */
-#include <sys/types.h> /* for u_int32_t, if defined */
-#include <sys/time.h> /* for struct timeval */
-#include <net/ppp_defs.h>
-#include "rtemsdialer.h"
-
-#if defined(__STDC__)
-#include <stdarg.h>
-#define __V(x) x
-#else
-#include <varargs.h>
-#define __V(x) (va_alist) va_dcl
-#define const
-#define volatile
-#endif
-
-#ifdef INET6
-#include "eui64.h"
-#endif
-
-/*
- * Limits.
- */
-
-#define NUM_PPP 1 /* One PPP interface supported (per process) */
-#define MAXWORDLEN 1024 /* max length of word in file (incl null) */
-#define MAXARGS 1 /* max # args to a command */
-#define MAXNAMELEN 256 /* max length of hostname or name for auth */
-#define MAXSECRETLEN 256 /* max length of password or secret */
-
-/*
- * Option descriptor structure.
- */
-
-typedef unsigned char bool;
-
-enum opt_type {
- o_special_noarg = 0,
- o_special = 1,
- o_bool,
- o_int,
- o_uint32,
- o_string,
-};
-
-typedef struct {
- char *name; /* name of the option */
- enum opt_type type;
- void *addr;
- char *description;
- int flags;
- void *addr2;
- int upper_limit;
- int lower_limit;
-} option_t;
-
-/* Values for flags */
-#define OPT_VALUE 0xff /* mask for presupplied value */
-#define OPT_HEX 0x100 /* int option is in hex */
-#define OPT_NOARG 0x200 /* option doesn't take argument */
-#define OPT_OR 0x400 /* OR in argument to value */
-#define OPT_INC 0x800 /* increment value */
-#define OPT_PRIV 0x1000 /* privileged option */
-#define OPT_STATIC 0x2000 /* string option goes into static array */
-#define OPT_LLIMIT 0x4000 /* check value against lower limit */
-#define OPT_ULIMIT 0x8000 /* check value against upper limit */
-#define OPT_LIMITS (OPT_LLIMIT|OPT_ULIMIT)
-#define OPT_ZEROOK 0x10000 /* 0 value is OK even if not within limits */
-#define OPT_NOINCR 0x20000 /* value mustn't be increased */
-#define OPT_ZEROINF 0x40000 /* with OPT_NOINCR, 0 == infinity */
-#define OPT_A2INFO 0x100000 /* addr2 -> option_info to update */
-#define OPT_A2COPY 0x200000 /* addr2 -> second location to rcv value */
-#define OPT_ENABLE 0x400000 /* use *addr2 as enable for option */
-#define OPT_PRIVFIX 0x800000 /* can't be overridden if noauth */
-#define OPT_PREPASS 0x1000000 /* do this opt in pre-pass to find device */
-#define OPT_INITONLY 0x2000000 /* option can only be set in init phase */
-#define OPT_DEVEQUIV 0x4000000 /* equiv to device name */
-#define OPT_DEVNAM (OPT_PREPASS | OPT_INITONLY | OPT_DEVEQUIV)
-
-#define OPT_VAL(x) ((x) & OPT_VALUE)
-
-#ifndef GIDSET_TYPE
-#define GIDSET_TYPE gid_t
-#endif
-
-/* Structure representing a list of permitted IP addresses. */
-struct permitted_ip {
- int permit; /* 1 = permit, 0 = forbid */
- u_int32_t base; /* match if (addr & mask) == base */
- u_int32_t mask; /* base and mask are in network byte order */
-};
-
-/*
- * Unfortunately, the linux kernel driver uses a different structure
- * for statistics from the rest of the ports.
- * This structure serves as a common representation for the bits
- * pppd needs.
- */
-struct pppd_stats {
- unsigned int bytes_in;
- unsigned int bytes_out;
-};
-
-/* Used for storing a sequence of words. Usually malloced. */
-struct wordlist {
- struct wordlist *next;
- char *word;
-};
-
-/*
- * Global variables.
- */
-
-extern int pppd_kill_link; /* Signal to terminate processing loop */
-extern int hungup; /* Physical layer has disconnected */
-extern int pppifunit; /* Interface unit number */
-extern char ifname[]; /* Interface name */
-extern int pppd_ttyfd; /* Serial device file descriptor */
-extern char hostname[]; /* Our hostname */
-extern u_char outpacket_buf[]; /* Buffer for outgoing packets */
-extern int pppd_phase; /* Current state of link - see values below */
-extern int baud_rate; /* Current link speed in bits/sec */
-extern int redirect_stderr;/* Connector's stderr should go to file */
-extern char peer_authname[];/* Authenticated name of peer */
-extern int privileged; /* We were run by real-uid root */
-extern int need_holdoff; /* Need holdoff period after link terminates */
-extern char **script_env; /* Environment variables for scripts */
-extern int detached; /* Have detached from controlling tty */
-extern GIDSET_TYPE groups[NGROUPS_MAX]; /* groups the user is in */
-extern int ngroups; /* How many groups valid in groups */
-extern struct pppd_stats link_stats; /* byte/packet counts etc. for link */
-extern int using_pty; /* using pty as device (notty or pty opt.) */
-extern int log_to_fd; /* logging to this fd as well as syslog */
-extern char *no_ppp_msg; /* message to print if ppp not in kernel */
-extern volatile int pppd_status; /* exit status for pppd */
-extern int devnam_fixed; /* can no longer change devnam */
-extern int unsuccess; /* # unsuccessful connection attempts */
-extern int do_callback; /* set if we want to do callback next */
-extern int doing_callback; /* set if this is a callback */
-extern dialerfp pppd_dialer; /* script dialer function callback */
-
-/* Values for do_callback and doing_callback */
-#define CALLBACK_DIALIN 1 /* we are expecting the call back */
-#define CALLBACK_DIALOUT 2 /* we are dialling out to call back */
-
-/*
- * Variables set by command-line options.
- */
-
-extern int debug; /* Debug flag */
-extern int kdebugflag; /* Tell kernel to print debug messages */
-extern int default_device; /* Using /dev/tty or equivalent */
-extern char devnam[MAXPATHLEN]; /* Device name */
-extern int crtscts; /* Use hardware flow control */
-extern bool modem; /* Use modem control lines */
-extern int inspeed; /* Input/Output speed requested */
-extern u_int32_t netmask; /* IP netmask to set on interface */
-extern bool lockflag; /* Create lock file to lock the serial dev */
-extern bool nodetach; /* Don't detach from controlling tty */
-extern bool updetach; /* Detach from controlling tty when link up */
-extern char *initializer; /* Script to initialize physical link */
-extern char *connect_script; /* Script to establish physical link */
-extern char *disconnect_script; /* Script to disestablish physical link */
-extern char *welcomer; /* Script to welcome client after connection */
-extern char *ptycommand; /* Command to run on other side of pty */
-extern int maxconnect; /* Maximum connect time (seconds) */
-extern char user[MAXNAMELEN];/* Our name for authenticating ourselves */
-extern char passwd[MAXSECRETLEN]; /* Password for PAP or CHAP */
-extern bool auth_required; /* Peer is required to authenticate */
-extern bool persist; /* Reopen link after it goes down */
-extern bool uselogin; /* Use /etc/passwd for checking PAP */
-extern char our_name[MAXNAMELEN];/* Our name for authentication purposes */
-extern char remote_name[MAXNAMELEN]; /* Peer's name for authentication */
-extern bool explicit_remote;/* remote_name specified with remotename opt */
-extern bool demand; /* Do dial-on-demand */
-extern char *ipparam; /* Extra parameter for ip up/down scripts */
-extern bool cryptpap; /* Others' PAP passwords are encrypted */
-extern int idle_time_limit;/* Shut down link if idle for this long */
-extern int holdoff; /* Dead time before restarting */
-extern bool holdoff_specified; /* true if user gave a holdoff value */
-extern bool notty; /* Stdin/out is not a tty */
-extern char *record_file; /* File to record chars sent/received */
-extern bool sync_serial; /* Device is synchronous serial device */
-extern int maxfail; /* Max # of unsuccessful connection attempts */
-extern char linkname[MAXPATHLEN]; /* logical name for link */
-extern bool tune_kernel; /* May alter kernel settings as necessary */
-extern int connect_delay; /* Time to delay after connect script */
-
-#ifdef PPP_FILTER
-extern struct bpf_program pass_filter; /* Filter for pkts to pass */
-extern struct bpf_program active_filter; /* Filter for link-active pkts */
-#endif
-
-#ifdef MSLANMAN
-extern bool ms_lanman; /* Use LanMan password instead of NT */
- /* Has meaning only with MS-CHAP challenges */
-#endif
-
-extern char *current_option; /* the name of the option being parsed */
-extern int privileged_option; /* set iff the current option came from root */
-extern char *option_source; /* string saying where the option came from */
-
-/*
- * Values for phase.
- */
-#define PHASE_DEAD 0
-#define PHASE_INITIALIZE 1
-#define PHASE_SERIALCONN 2
-#define PHASE_DORMANT 3
-#define PHASE_ESTABLISH 4
-#define PHASE_AUTHENTICATE 5
-#define PHASE_CALLBACK 6
-#define PHASE_NETWORK 7
-#define PHASE_RUNNING 8
-#define PHASE_TERMINATE 9
-#define PHASE_DISCONNECT 10
-#define PHASE_HOLDOFF 11
-
-/*
- * The following struct gives the addresses of procedures to call
- * for a particular protocol.
- */
-struct protent {
- u_short protocol; /* PPP protocol number */
- /* Initialization procedure */
- void (*init) __P((int unit));
- /* Process a received packet */
- void (*input) __P((int unit, u_char *pkt, int len));
- /* Process a received protocol-reject */
- void (*protrej) __P((int unit));
- /* Lower layer has come up */
- void (*lowerup) __P((int unit));
- /* Lower layer has gone down */
- void (*lowerdown) __P((int unit));
- /* Open the protocol */
- void (*open) __P((int unit));
- /* Close the protocol */
- void (*close) __P((int unit, char *reason));
- /* Print a packet in readable form */
- int (*printpkt) __P((u_char *pkt, int len,
- void (*printer) __P((void *, char *, ...)),
- void *arg));
- /* Process a received data packet */
- void (*datainput) __P((int unit, u_char *pkt, int len));
- bool enabled_flag; /* 0 iff protocol is disabled */
- char *name; /* Text name of protocol */
- char *data_name; /* Text name of corresponding data protocol */
- option_t *options; /* List of command-line options */
- /* Check requested options, assign defaults */
- void (*check_options) __P((void));
- /* Configure interface for demand-dial */
- int (*demand_conf) __P((int unit));
- /* Say whether to bring up link for this pkt */
- int (*active_pkt) __P((u_char *pkt, int len));
-};
-
-/* Table of pointers to supported protocols */
-extern struct protent *protocols[];
-
-/*
- * Prototypes.
- */
-
-/* Procedures exported from main.c. */
-void die __P((int)); /* Cleanup and exit */
-void quit __P((void)); /* like die(1) */
-void novm __P((char *)); /* Say we ran out of memory, and die */
-void ppptimeout __P((void (*func)(void *), void *arg, int t));
- /* Call func(arg) after t seconds */
-void untimeout __P((void (*func)(void *), void *arg));
- /* Cancel call to func(arg) */
-void update_link_stats __P((int)); /* Get stats at link termination */
-void new_phase __P((int)); /* signal start of new phase */
-
-/* Procedures exported from utils.c. */
-void log_packet __P((u_char *, int, char *, int));
- /* Format a packet and log it with syslog */
-void print_string __P((void *, int, void (*) (void *, char *, ...),
- void *)); /* Format a string for output */
-int slprintf __P((char *, int, char *, ...)); /* sprintf++ */
-int vslprintf __P((char *, int, char *, va_list)); /* vsprintf++ */
-size_t strlcpy __P((char *, const char *, size_t)); /* safe strcpy */
-size_t strlcat __P((char *, const char *, size_t)); /* safe strncpy */
-void pppd_dbglog __P((char *, ...)); /* log a debug message */
-void pppd_info __P((char *, ...)); /* log an informational message */
-void pppd_notice __P((char *, ...)); /* log a notice-level message */
-void pppd_warn __P((char *, ...)); /* log a warning message */
-void pppd_error __P((char *, ...)); /* log an error message */
-void pppd_fatal __P((char *, ...)); /* log an error message and die(1) */
-
-#define dbglog pppd_dbglog
-#define info pppd_info
-#define notice pppd_notice
-#define warn pppd_warn
-#define error pppd_error
-#define fatal pppd_fatal
-
-/* Procedures exported from auth.c */
-void link_required __P((int)); /* we are starting to use the link */
-void link_terminated __P((int)); /* we are finished with the link */
-void link_down __P((int)); /* the LCP layer has left the Opened state */
-void link_established __P((int)); /* the link is up; authenticate now */
-void start_networks __P((void)); /* start all the network control protos */
-void np_up __P((int, int)); /* a network protocol has come up */
-void np_down __P((int, int)); /* a network protocol has gone down */
-void np_finished __P((int, int)); /* a network protocol no longer needs link */
-void auth_peer_fail __P((int, int));
- /* peer failed to authenticate itself */
-void auth_peer_success __P((int, int, char *, int));
- /* peer successfully authenticated itself */
-void auth_withpeer_fail __P((int, int));
- /* we failed to authenticate ourselves */
-void auth_withpeer_success __P((int, int));
- /* we successfully authenticated ourselves */
-int auth_check_options __P((void));
- /* check authentication options supplied */
-void auth_reset __P((int)); /* check what secrets we have */
-int check_passwd __P((int, char *, int, char *, int, char **));
- /* Check peer-supplied username/password */
-int get_secret __P((int, char *, char *, char *, int *, int));
- /* get "secret" for chap */
-int auth_ip_addr __P((int, u_int32_t));
- /* check if IP address is authorized */
-int bad_ip_adrs __P((u_int32_t));
- /* check if IP address is unreasonable */
-
-/* Procedures exported from demand.c */
-void demand_conf __P((void)); /* config interface(s) for demand-dial */
-void demand_block __P((void)); /* set all NPs to queue up packets */
-void demand_unblock __P((void)); /* set all NPs to pass packets */
-void demand_discard __P((void)); /* set all NPs to discard packets */
-void demand_rexmit __P((int)); /* retransmit saved frames for an NP */
-int loop_chars __P((unsigned char *, int)); /* process chars from loopback */
-int loop_frame __P((unsigned char *, int)); /* should we bring link up? */
-
-/* Procedures exported from sys-*.c */
-void sys_init __P((void)); /* Do system-dependent initialization */
-void sys_cleanup __P((void)); /* Restore system state before exiting */
-int sys_check_options __P((void)); /* Check options specified */
-void sys_close __P((void)); /* Clean up in a child before execing */
-int ppp_available __P((void)); /* Test whether ppp kernel support exists */
-int get_pty __P((int *, int *, char *, int)); /* Get pty master/slave */
-int open_ppp_loopback __P((void)); /* Open loopback for demand-dialling */
-int establish_ppp __P((int)); /* Turn serial port into a ppp interface */
-void restore_loop __P((void)); /* Transfer ppp unit back to loopback */
-void disestablish_ppp __P((int)); /* Restore port to normal operation */
-void clean_check __P((void)); /* Check if line was 8-bit clean */
-void set_up_tty __P((int, int)); /* Set up port's speed, parameters, etc. */
-void restore_tty __P((int)); /* Restore port's original parameters */
-void setdtr __P((int, int)); /* Raise or lower port's DTR line */
-void output __P((int, u_char *, int)); /* Output a PPP packet */
-void wait_input __P((struct timeval *)); /* Wait for input, with timeout */
-
-void ppp_delay __P((void)); /* delay task for a little while */
-int read_packet __P((u_char *)); /* Read PPP packet */
-int get_loop_output __P((void)); /* Read pkts from loopback */
-void ppp_send_config __P((int, int, u_int32_t, int, int));
- /* Configure i/f transmit parameters */
-void ppp_set_xaccm __P((int, ext_accm));
- /* Set extended transmit ACCM */
-void ppp_recv_config __P((int, int, u_int32_t, int, int));
- /* Configure i/f receive parameters */
-int ccp_test __P((int, u_char *, int, int));
- /* Test support for compression scheme */
-void ccp_flags_set __P((int, int, int));
- /* Set kernel CCP state */
-int ccp_fatal_error __P((int)); /* Test for fatal decomp error in kernel */
-int get_idle_time __P((int, struct ppp_idle *));
- /* Find out how long link has been idle */
-int get_ppp_stats __P((int, struct pppd_stats *));
- /* Return link statistics */
-int sifvjcomp __P((int, int, int, int));
- /* Configure VJ TCP header compression */
-int sifup __P((int)); /* Configure i/f up for one protocol */
-int sifnpmode __P((int u, int proto, enum NPmode mode));
- /* Set mode for handling packets for proto */
-int sifdown __P((int)); /* Configure i/f down for one protocol */
-int sifaddr __P((int, u_int32_t, u_int32_t, u_int32_t));
- /* Configure IPv4 addresses for i/f */
-int cifaddr __P((int, u_int32_t, u_int32_t));
- /* Reset i/f IP addresses */
-#ifdef INET6
-int sif6addr __P((int, eui64_t, eui64_t));
- /* Configure IPv6 addresses for i/f */
-int cif6addr __P((int, eui64_t, eui64_t));
- /* Remove an IPv6 address from i/f */
-#endif
-int sifdefaultroute __P((int, u_int32_t, u_int32_t));
- /* Create default route through i/f */
-int cifdefaultroute __P((int, u_int32_t, u_int32_t));
- /* Delete default route through i/f */
-int sifproxyarp __P((int, u_int32_t));
- /* Add proxy ARP entry for peer */
-int cifproxyarp __P((int, u_int32_t));
- /* Delete proxy ARP entry for peer */
-u_int32_t GetMask __P((u_int32_t)); /* Get appropriate netmask for address */
-int lock __P((char *)); /* Create lock file for device */
-int relock __P((int)); /* Rewrite lock file with new pid */
-void unlock __P((void)); /* Delete previously-created lock file */
-void logwtmp __P((const char *, const char *, const char *));
- /* Write entry to wtmp file */
-int get_host_seed __P((void)); /* Get host-dependent random number seed */
-int have_route_to __P((u_int32_t)); /* Check if route to addr exists */
-#ifdef PPP_FILTER
-int set_filters __P((struct bpf_program *pass, struct bpf_program *active));
- /* Set filter programs in kernel */
-#endif
-#ifdef IPX_CHANGE
-int sipxfaddr __P((int, unsigned long, unsigned char *));
-int cipxfaddr __P((int));
-#endif
-
-/* Procedures exported from options.c */
-int parse_args __P((int argc, char **argv));
- /* Parse options from arguments given */
-int options_from_file __P((char *filename, int must_exist, int check_prot,
- int privileged));
- /* Parse options from an options file */
-int options_from_user __P((void)); /* Parse options from user's .ppprc */
-int options_for_tty __P((void)); /* Parse options from /etc/ppp/options.tty */
-int options_from_list __P((struct wordlist *, int privileged));
- /* Parse options from a wordlist */
-int getword __P((FILE *f, char *word, int *newlinep, char *filename));
- /* Read a word from a file */
-void option_error __P((char *fmt, ...));
- /* Print an error message about an option */
-int int_option __P((char *, int *));
- /* Simplified number_option for decimal ints */
-void add_options __P((option_t *)); /* Add extra options */
-
-/*
- * This structure is used to store information about certain
- * options, such as where the option value came from (/etc/ppp/options,
- * command line, etc.) and whether it came from a privileged source.
- */
-
-struct option_info {
- int priv; /* was value set by sysadmin? */
- char *source; /* where option came from */
-};
-
-extern struct option_info devnam_info;
-extern struct option_info initializer_info;
-extern struct option_info connect_script_info;
-extern struct option_info disconnect_script_info;
-extern struct option_info welcomer_info;
-extern struct option_info ptycommand_info;
-
-/*
- * Hooks to enable plugins to change various things.
- */
-extern int (*new_phase_hook) __P((int));
-extern int (*idle_time_hook) __P((struct ppp_idle *));
-extern int (*holdoff_hook) __P((void));
-extern int (*pap_check_hook) __P((void));
-extern int (*pap_auth_hook) __P((char *user, char *passwd/*, char **msgp,
- struct wordlist **paddrs,
- struct wordlist **popts*/));
-extern void (*pap_logout_hook) __P((void));
-extern int (*pap_passwd_hook) __P((char *user, char *passwd));
-extern void (*ip_up_hook) __P((void));
-extern void (*ip_down_hook) __P((void));
-extern void (*auth_linkup_hook) __P((void));
-extern void (*auth_linkdown_hook) __P((void));
-
-/*
- * Inline versions of get/put char/short/long.
- * Pointer is advanced; we assume that both arguments
- * are lvalues and will already be in registers.
- * cp MUST be u_char *.
- */
-#define GETCHAR(c, cp) { \
- (c) = *(cp)++; \
-}
-#define PUTCHAR(c, cp) { \
- *(cp)++ = (u_char) (c); \
-}
-
-
-#define GETSHORT(s, cp) { \
- (s) = *(cp)++ << 8; \
- (s) |= *(cp)++; \
-}
-#define PUTSHORT(s, cp) { \
- *(cp)++ = (u_char) ((s) >> 8); \
- *(cp)++ = (u_char) (s); \
-}
-
-#define GETLONG(l, cp) { \
- (l) = *(cp)++ << 8; \
- (l) |= *(cp)++; (l) <<= 8; \
- (l) |= *(cp)++; (l) <<= 8; \
- (l) |= *(cp)++; \
-}
-#define PUTLONG(l, cp) { \
- *(cp)++ = (u_char) ((l) >> 24); \
- *(cp)++ = (u_char) ((l) >> 16); \
- *(cp)++ = (u_char) ((l) >> 8); \
- *(cp)++ = (u_char) (l); \
-}
-
-#define INCPTR(n, cp) ((cp) += (n))
-#define DECPTR(n, cp) ((cp) -= (n))
-
-/*
- * System dependent definitions for user-level 4.3BSD UNIX implementation.
- */
-
-#define TIMEOUT(r, f, t) ppptimeout((r), (f), (t))
-#define UNTIMEOUT(r, f) untimeout((r), (f))
-
-#define BCOPY(s, d, l) memcpy(d, s, l)
-#define BZERO(s, n) memset(s, 0, n)
-
-#define PRINTMSG(m, l) { info("Remote message: %0.*v", l, m); }
-
-/*
- * MAKEHEADER - Add Header fields to a packet.
- */
-#define MAKEHEADER(p, t) { \
- PUTCHAR(PPP_ALLSTATIONS, p); \
- PUTCHAR(PPP_UI, p); \
- PUTSHORT(t, p); }
-
-/*
- * Exit status values.
- */
-#define EXIT_OK 0
-#define EXIT_FATAL_ERROR 1
-#define EXIT_OPTION_ERROR 2
-#define EXIT_NOT_ROOT 3
-#define EXIT_NO_KERNEL_SUPPORT 4
-#define EXIT_USER_REQUEST 5
-#define EXIT_LOCK_FAILED 6
-#define EXIT_OPEN_FAILED 7
-#define EXIT_CONNECT_FAILED 8
-#define EXIT_PTYCMD_FAILED 9
-#define EXIT_NEGOTIATION_FAILED 10
-#define EXIT_PEER_AUTH_FAILED 11
-#define EXIT_IDLE_TIMEOUT 12
-#define EXIT_CONNECT_TIME 13
-#define EXIT_CALLBACK 14
-#define EXIT_PEER_DEAD 15
-#define EXIT_HANGUP 16
-#define EXIT_LOOPBACK 17
-#define EXIT_INIT_FAILED 18
-#define EXIT_AUTH_TOPEER_FAILED 19
-
-/*
- * Debug macros. Slightly useful for finding bugs in pppd, not particularly
- * useful for finding out why your connection isn't being established.
- */
-
-#ifdef DEBUGALL
-#define DEBUGMAIN 1
-#define DEBUGFSM 1
-#define DEBUGLCP 1
-#define DEBUGIPCP 1
-#define DEBUGIPV6CP 1
-#define DEBUGUPAP 1
-#define DEBUGCHAP 1
-#endif
-#define DEBUGMAIN 1
-#define DEBUGUPAP 1
-#define DEBUGCHAP 1
-
-
-#ifdef DEBUGMAIN
-#define MAINDEBUG(x) if (debug) dbglog x
-#else
-#define MAINDEBUG(x)
-#endif
-
-#ifdef DEBUGSYS
-#define SYSDEBUG(x) if (debug) dbglog x
-#else
-#define SYSDEBUG(x)
-#endif
-
-#ifdef DEBUGFSM
-#define FSMDEBUG(x) if (debug) dbglog x
-#else
-#define FSMDEBUG(x)
-#endif
-
-#ifdef DEBUGLCP
-#define LCPDEBUG(x) if (debug) dbglog x
-#else
-#define LCPDEBUG(x)
-#endif
-
-#ifdef DEBUGIPCP
-#define IPCPDEBUG(x) if (debug) dbglog x
-#else
-#define IPCPDEBUG(x)
-#endif
-
-#ifdef DEBUGIPV6CP
-#define IPV6CPDEBUG(x) if (debug) dbglog x
-#else
-#define IPV6CPDEBUG(x)
-#endif
-
-#ifdef DEBUGUPAP
-#define UPAPDEBUG(x) if (debug) dbglog x
-#else
-#define UPAPDEBUG(x)
-#endif
-
-#ifdef DEBUGCHAP
-#define CHAPDEBUG(x) if (debug) dbglog x
-#else
-#define CHAPDEBUG(x)
-#endif
-
-#ifdef DEBUGIPXCP
-#define IPXCPDEBUG(x) if (debug) dbglog x
-#else
-#define IPXCPDEBUG(x)
-#endif
-
-#ifndef SIGTYPE
-#if defined(sun) || defined(SYSV) || defined(POSIX_SOURCE)
-#define SIGTYPE void
-#else
-#define SIGTYPE int
-#endif /* defined(sun) || defined(SYSV) || defined(POSIX_SOURCE) */
-#endif /* SIGTYPE */
-
-#ifndef MIN
-#define MIN(a, b) ((a) < (b)? (a): (b))
-#endif
-#ifndef MAX
-#define MAX(a, b) ((a) > (b)? (a): (b))
-#endif
-
-#endif /* __PPP_H__ */
diff --git a/c/src/libnetworking/pppd/preinstall.am b/c/src/libnetworking/pppd/preinstall.am
deleted file mode 100644
index 32f9bc2742..0000000000
--- a/c/src/libnetworking/pppd/preinstall.am
+++ /dev/null
@@ -1,27 +0,0 @@
-## Automatically generated by ampolish3 - Do not edit
-
-if AMPOLISH3
-$(srcdir)/preinstall.am: Makefile.am
- $(AMPOLISH3) $(srcdir)/Makefile.am > $(srcdir)/preinstall.am
-endif
-
-PREINSTALL_DIRS =
-DISTCLEANFILES += $(PREINSTALL_DIRS)
-
-PREINSTALL_FILES =
-CLEANFILES += $(PREINSTALL_FILES)
-
-if HAS_NETWORKING
-$(PROJECT_INCLUDE)/rtems/$(dirstamp):
- @$(mkdir_p) $(PROJECT_INCLUDE)/rtems
- @: > $(PROJECT_INCLUDE)/rtems/$(dirstamp)
-PREINSTALL_DIRS += $(PROJECT_INCLUDE)/rtems/$(dirstamp)
-
-$(PROJECT_INCLUDE)/rtems/rtemspppd.h: rtemspppd.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
- $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rtemspppd.h
-PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rtemspppd.h
-
-$(PROJECT_INCLUDE)/rtems/rtemsdialer.h: rtemsdialer.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
- $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rtemsdialer.h
-PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rtemsdialer.h
-endif
diff --git a/c/src/libnetworking/pppd/rtemsdialer.h b/c/src/libnetworking/pppd/rtemsdialer.h
deleted file mode 100644
index 611986b802..0000000000
--- a/c/src/libnetworking/pppd/rtemsdialer.h
+++ /dev/null
@@ -1,24 +0,0 @@
-
-#ifndef DIALER_H
-#define DIALER_H
-
-/* define constant mode values */
-#define DIALER_INIT 0
-#define DIALER_CONNECT 1
-#define DIALER_WELCOME 2
-#define DIALER_DISCONNECT 3
-
-/* define constant return values */
-#define DIALER_SUCCESS 0
-#define DIALER_INVALIDARG 1
-#define DIALER_UNEXPECTED 2
-#define DIALER_TIMEOUT 3
-#define DIALER_CMDFAILED 4
-
-/* define typedef for dialer function prototype */
-typedef int (*dialerfp)(int tty, int mode, char *pScript);
-
-/* declare default chat program dialer */
-extern int chatmain(int tty, int mode, char *pScript);
-
-#endif
diff --git a/c/src/libnetworking/pppd/rtemsmain.c b/c/src/libnetworking/pppd/rtemsmain.c
deleted file mode 100644
index 4180453555..0000000000
--- a/c/src/libnetworking/pppd/rtemsmain.c
+++ /dev/null
@@ -1,896 +0,0 @@
-/*
- * main.c - Point-to-Point Protocol main module
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#define RCSID "$Id$"
-
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <signal.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <netdb.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-
-#include <rtems.h>
-#include <rtems/rtems_bsdnet.h>
-
-#include "pppd.h"
-#include "magic.h"
-#include "fsm.h"
-#include "lcp.h"
-#include "ipcp.h"
-#ifdef INET6
-#include "ipv6cp.h"
-#endif
-#include "upap.h"
-#include "chap.h"
-#include "ccp.h"
-#include "pathnames.h"
-#include "patchlevel.h"
-#include "rtemsdialer.h"
-
-#ifdef CBCP_SUPPORT
-#include "cbcp.h"
-#endif
-
-#ifdef IPX_CHANGE
-#include "ipxcp.h"
-#endif /* IPX_CHANGE */
-#ifdef AT_CHANGE
-#include "atcp.h"
-#endif
-
-static const char rcsid[] = RCSID;
-
-/* interface vars */
-char ifname[32]; /* Interface name */
-int pppifunit; /* Interface unit number */
-
-char hostname[MAXNAMELEN]; /* Our hostname */
-static char ppp_devnam[MAXPATHLEN]; /* name of PPP tty (maybe ttypx) */
-
-int pppd_ttyfd; /* Serial port file descriptor */
-int baud_rate; /* Actual bits/second for serial device */
-int hungup; /* terminal has been hung up */
-int privileged; /* we're running as real uid root */
-int need_holdoff; /* need holdoff period before restarting */
-int detached; /* have detached from terminal */
-struct stat devstat; /* result of stat() on devnam */
-int prepass = 0; /* doing prepass to find device name */
-int devnam_fixed; /* set while in options.ttyxx file */
-volatile int pppd_status; /* exit status for pppd */
-int unsuccess; /* # unsuccessful connection attempts */
-int do_callback; /* != 0 if we should do callback next */
-int doing_callback; /* != 0 if we are doing callback */
-char *callback_script; /* script for doing callback */
-dialerfp pppd_dialer;
-
-int (*holdoff_hook) __P((void)) = NULL;
-int (*new_phase_hook) __P((int)) = NULL;
-
-static int fd_ppp = -1; /* fd for talking PPP */
-static int pty_master; /* fd for master side of pty */
-static int pty_slave; /* fd for slave side of pty */
-static int real_ttyfd; /* fd for actual serial port (not pty) */
-
-int pppd_phase; /* where the link is at */
-int pppd_kill_link;
-int open_ccp_flag;
-
-char **script_env; /* Env. variable values for scripts */
-int s_env_nalloc; /* # words avail at script_env */
-
-u_char outpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for outgoing packet */
-u_char inpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for incoming packet */
-
-char *no_ppp_msg = "Sorry - this system lacks PPP kernel support\n";
-
-static struct timeval start_time; /* Time when link was started. */
-
-struct pppd_stats link_stats;
-int link_connect_time;
-int link_stats_valid;
-
-/* Prototypes for procedures local to this file. */
-
-static void cleanup __P((void));
-static void close_tty __P((void));
-static void get_input __P((void));
-static void calltimeout __P((void));
-static struct timeval *timeleft __P((struct timeval *));
-static void holdoff_end __P((void *));
-static int device_script __P((int, int, char *));
-
-extern char *ttyname __P((int));
-extern char *getlogin __P((void));
-int pppdmain __P((int, char *[]));
-
-/*
- * PPP Data Link Layer "protocol" table.
- * One entry per supported protocol.
- * The last entry must be NULL.
- */
-struct protent *protocols[] = {
- &lcp_protent,
- &pap_protent,
- &chap_protent,
-#ifdef CBCP_SUPPORT
- &cbcp_protent,
-#endif
- &ipcp_protent,
-#ifdef INET6
- &ipv6cp_protent,
-#endif
- &ccp_protent,
-#ifdef IPX_CHANGE
- &ipxcp_protent,
-#endif
-#ifdef AT_CHANGE
- &atcp_protent,
-#endif
- NULL
-};
-
-int
-pppdmain(argc, argv)
- int argc;
- char *argv[];
-{
- int i, fdflags, t;
- char *connector;
- struct timeval timo;
- struct protent *protp;
-
- new_phase(PHASE_INITIALIZE);
-
- script_env = NULL;
- hostname[MAXNAMELEN-1] = 0;
- privileged = 1;
- privileged_option = 1;
-
- /*
- * Initialize magic number generator now so that protocols may
- * use magic numbers in initialization.
- */
- magic_init();
-
-#ifdef XXX_XXX
- /* moved code the the rtems_pppd_reset_options function */
-
- /*
- * Initialize to the standard option set, then parse, in order,
- * the system options file, the user's options file,
- * the tty's options file, and the command line arguments.
- */
- for (i = 0; (protp = protocols[i]) != NULL; ++i)
- (*protp->init)(0);
-#endif
-
-
- if (!ppp_available()) {
- option_error(no_ppp_msg);
- return(EXIT_NO_KERNEL_SUPPORT);
- }
-
- /*
- * Check that the options given are valid and consistent.
- */
- if (!sys_check_options()) {
- return(EXIT_OPTION_ERROR);
- }
- if (!auth_check_options()) {
- return(EXIT_OPTION_ERROR);
- }
- for (i = 0; (protp = protocols[i]) != NULL; ++i)
- if (protp->check_options != NULL)
- (*protp->check_options)();
-
- /* default holdoff to 0 if no connect script has been given */
- if (connect_script == 0 && !holdoff_specified)
- holdoff = 0;
-
- if (default_device)
- nodetach = 1;
-
- /*
- * Initialize system-dependent stuff.
- */
- sys_init();
- /* if (debug)
- setlogmask(LOG_UPTO(LOG_DEBUG));
- */
-
- do_callback = 0;
- for (;;) {
-
- need_holdoff = 1;
- pppd_ttyfd = -1;
- real_ttyfd = -1;
- pppd_status = EXIT_OK;
- ++unsuccess;
- doing_callback = do_callback;
- do_callback = 0;
-
- new_phase(PHASE_SERIALCONN);
-
- /*
- * Get a pty master/slave pair if the pty, notty, or record
- * options were specified.
- */
- strlcpy(ppp_devnam, devnam, sizeof(ppp_devnam));
- pty_master = -1;
- pty_slave = -1;
-
- /*
- * Open the serial device and set it up to be the ppp interface.
- * First we open it in non-blocking mode so we can set the
- * various termios flags appropriately. If we aren't dialling
- * out and we want to use the modem lines, we reopen it later
- * in order to wait for the carrier detect signal from the modem.
- */
- hungup = 0;
- pppd_kill_link = 0;
- connector = doing_callback? callback_script: connect_script;
- if (devnam[0] != 0) {
- for (;;) {
- /* If the user specified the device name, become the
- user before opening it. */
- int err;
- pppd_ttyfd = open(devnam, O_NONBLOCK | O_RDWR, 0);
- err = errno;
- if (pppd_ttyfd >= 0) {
- break;
- }
- errno = err;
- if (err != EINTR) {
- error("Failed to open %s: %m", devnam);
- pppd_status = EXIT_OPEN_FAILED;
- }
- if (!persist || err != EINTR)
- goto fail;
- }
- if ((fdflags = fcntl(pppd_ttyfd, F_GETFL)) == -1
- || fcntl(pppd_ttyfd, F_SETFL, fdflags & ~O_NONBLOCK) < 0)
- warn("Couldn't reset non-blocking mode on device: %m");
-
- /*
- * Set line speed, flow control, etc.
- * If we have a non-null connection or initializer script,
- * on most systems we set CLOCAL for now so that we can talk
- * to the modem before carrier comes up. But this has the
- * side effect that we might miss it if CD drops before we
- * get to clear CLOCAL below. On systems where we can talk
- * successfully to the modem with CLOCAL clear and CD down,
- * we could clear CLOCAL at this point.
- */
- set_up_tty(pppd_ttyfd, ((connector != NULL && connector[0] != 0)
- || initializer != NULL));
- real_ttyfd = pppd_ttyfd;
- }
-
- /* run connection script */
- if ((connector && connector[0]) || initializer) {
- if (real_ttyfd != -1) {
- /* XXX do this if doing_callback == CALLBACK_DIALIN? */
- if (!default_device && modem) {
- setdtr(real_ttyfd, 0); /* in case modem is off hook */
- sleep(1);
- setdtr(real_ttyfd, 1);
- }
- }
-
- if (initializer && initializer[0]) {
- if (device_script(pppd_ttyfd, DIALER_INIT, initializer) < 0) {
- error("Initializer script failed");
- pppd_status = EXIT_INIT_FAILED;
- goto fail;
- }
- if (pppd_kill_link)
- goto disconnect;
-
- info("Serial port initialized.");
- }
-
- if (connector && connector[0]) {
- if (device_script(pppd_ttyfd, DIALER_CONNECT, connector) < 0) {
- error("Connect script failed");
- pppd_status = EXIT_CONNECT_FAILED;
- goto fail;
- }
- if (pppd_kill_link)
- goto disconnect;
-
- info("Serial connection established.");
- }
-
- /* set line speed, flow control, etc.;
- clear CLOCAL if modem option */
- if (real_ttyfd != -1)
- set_up_tty(real_ttyfd, 0);
-
- if (doing_callback == CALLBACK_DIALIN)
- connector = NULL;
- }
-
- /* reopen tty if necessary to wait for carrier */
- if (connector == NULL && modem && devnam[0] != 0) {
- for (;;) {
- if ((i = open(devnam, O_RDWR)) >= 0)
- break;
- if (errno != EINTR) {
- error("Failed to reopen %s: %m", devnam);
- pppd_status = EXIT_OPEN_FAILED;
- }
- if (!persist || errno != EINTR || hungup || pppd_kill_link)
- goto fail;
- }
- close(i);
- }
-
- info("Serial connection established.");
- sleep(1);
-
- /* run welcome script, if any */
- if (welcomer && welcomer[0]) {
- if (device_script(pppd_ttyfd, DIALER_WELCOME, welcomer) < 0)
- warn("Welcome script failed");
- }
-
- /* set up the serial device as a ppp interface */
- fd_ppp = establish_ppp(pppd_ttyfd);
- if (fd_ppp < 0) {
- pppd_status = EXIT_FATAL_ERROR;
- goto disconnect;
- }
-
- if (!demand) {
- info("Using interface ppp%d", pppifunit);
- slprintf(ifname, sizeof(ifname), "ppp%d", pppifunit);
- }
-
- /*
- * Start opening the connection and wait for
- * incoming events (reply, timeout, etc.).
- */
- notice("Connect: %s <--> %s", ifname, ppp_devnam);
- gettimeofday(&start_time, NULL);
-
- lcp_lowerup(0);
- lcp_open(0); /* Start protocol */
-
- open_ccp_flag = 0;
- pppd_status = EXIT_NEGOTIATION_FAILED;
- new_phase(PHASE_ESTABLISH);
- while (pppd_phase != PHASE_DEAD) {
- wait_input(timeleft(&timo));
- calltimeout();
- get_input();
-
- if (pppd_kill_link) {
- lcp_close(0, "User request");
- pppd_kill_link = 0;
- }
- if (open_ccp_flag) {
- if (pppd_phase == PHASE_NETWORK || pppd_phase == PHASE_RUNNING) {
- ccp_fsm[0].flags = OPT_RESTART; /* clears OPT_SILENT */
- (*ccp_protent.open)(0);
- }
- open_ccp_flag = 0;
- }
- }
-
- /*
- * If we may want to bring the link up again, transfer
- * the ppp unit back to the loopback. Set the
- * real serial device back to its normal mode of operation.
- */
- clean_check();
- if (demand)
- restore_loop();
- disestablish_ppp(pppd_ttyfd);
- fd_ppp = -1;
- if (!hungup)
- lcp_lowerdown(0);
-
- /*
- * Run disconnector script, if requested.
- * XXX we may not be able to do this if the line has hung up!
- */
- disconnect:
- if (disconnect_script && !hungup) {
- new_phase(PHASE_DISCONNECT);
- if (real_ttyfd >= 0)
- set_up_tty(real_ttyfd, 1);
- if (device_script(pppd_ttyfd, DIALER_DISCONNECT, disconnect_script) < 0) {
- warn("disconnect script failed");
- } else {
- info("Serial link disconnected.");
- }
- }
-
- fail:
- if (pty_master >= 0)
- close(pty_master);
- if (pty_slave >= 0)
- close(pty_slave);
- if (real_ttyfd >= 0)
- close_tty();
-
- if (!persist || (maxfail > 0 && unsuccess >= maxfail))
- break;
-
- pppd_kill_link = 0;
- if (demand)
- demand_discard();
- t = need_holdoff? holdoff: 0;
- if (holdoff_hook)
- t = (*holdoff_hook)();
- if (t > 0) {
- new_phase(PHASE_HOLDOFF);
- TIMEOUT(holdoff_end, NULL, t);
- do {
- wait_input(timeleft(&timo));
-
- calltimeout();
- if (pppd_kill_link) {
- pppd_kill_link = 0;
- new_phase(PHASE_DORMANT); /* allow signal to end holdoff */
- }
- } while (pppd_phase == PHASE_HOLDOFF);
- if (!persist)
- break;
- }
- }
-
- die(pppd_status);
- return pppd_status;
-}
-
-/*
- * holdoff_end - called via a timeout when the holdoff period ends.
- */
-static void
-holdoff_end(arg)
- void *arg;
-{
- new_phase(PHASE_DORMANT);
-}
-
-/* List of protocol names, to make our messages a little more informative. */
-struct protocol_list {
- u_short proto;
- const char *name;
-} protocol_list[] = {
- { 0x21, "IP" },
- { 0x23, "OSI Network Layer" },
- { 0x25, "Xerox NS IDP" },
- { 0x27, "DECnet Phase IV" },
- { 0x29, "Appletalk" },
- { 0x2b, "Novell IPX" },
- { 0x2d, "VJ compressed TCP/IP" },
- { 0x2f, "VJ uncompressed TCP/IP" },
- { 0x31, "Bridging PDU" },
- { 0x33, "Stream Protocol ST-II" },
- { 0x35, "Banyan Vines" },
- { 0x39, "AppleTalk EDDP" },
- { 0x3b, "AppleTalk SmartBuffered" },
- { 0x3d, "Multi-Link" },
- { 0x3f, "NETBIOS Framing" },
- { 0x41, "Cisco Systems" },
- { 0x43, "Ascom Timeplex" },
- { 0x45, "Fujitsu Link Backup and Load Balancing (LBLB)" },
- { 0x47, "DCA Remote Lan" },
- { 0x49, "Serial Data Transport Protocol (PPP-SDTP)" },
- { 0x4b, "SNA over 802.2" },
- { 0x4d, "SNA" },
- { 0x4f, "IP6 Header Compression" },
- { 0x6f, "Stampede Bridging" },
- { 0xfb, "single-link compression" },
- { 0xfd, "1st choice compression" },
- { 0x0201, "802.1d Hello Packets" },
- { 0x0203, "IBM Source Routing BPDU" },
- { 0x0205, "DEC LANBridge100 Spanning Tree" },
- { 0x0231, "Luxcom" },
- { 0x0233, "Sigma Network Systems" },
- { 0x8021, "Internet Protocol Control Protocol" },
- { 0x8023, "OSI Network Layer Control Protocol" },
- { 0x8025, "Xerox NS IDP Control Protocol" },
- { 0x8027, "DECnet Phase IV Control Protocol" },
- { 0x8029, "Appletalk Control Protocol" },
- { 0x802b, "Novell IPX Control Protocol" },
- { 0x8031, "Bridging NCP" },
- { 0x8033, "Stream Protocol Control Protocol" },
- { 0x8035, "Banyan Vines Control Protocol" },
- { 0x803d, "Multi-Link Control Protocol" },
- { 0x803f, "NETBIOS Framing Control Protocol" },
- { 0x8041, "Cisco Systems Control Protocol" },
- { 0x8043, "Ascom Timeplex" },
- { 0x8045, "Fujitsu LBLB Control Protocol" },
- { 0x8047, "DCA Remote Lan Network Control Protocol (RLNCP)" },
- { 0x8049, "Serial Data Control Protocol (PPP-SDCP)" },
- { 0x804b, "SNA over 802.2 Control Protocol" },
- { 0x804d, "SNA Control Protocol" },
- { 0x804f, "IP6 Header Compression Control Protocol" },
- { 0x006f, "Stampede Bridging Control Protocol" },
- { 0x80fb, "Single Link Compression Control Protocol" },
- { 0x80fd, "Compression Control Protocol" },
- { 0xc021, "Link Control Protocol" },
- { 0xc023, "Password Authentication Protocol" },
- { 0xc025, "Link Quality Report" },
- { 0xc027, "Shiva Password Authentication Protocol" },
- { 0xc029, "CallBack Control Protocol (CBCP)" },
- { 0xc081, "Container Control Protocol" },
- { 0xc223, "Challenge Handshake Authentication Protocol" },
- { 0xc281, "Proprietary Authentication Protocol" },
- { 0, NULL },
-};
-
-/*
- * protocol_name - find a name for a PPP protocol.
- */
-const char *
-protocol_name(proto)
- int proto;
-{
- struct protocol_list *lp;
-
- for (lp = protocol_list; lp->proto != 0; ++lp)
- if (proto == lp->proto)
- return lp->name;
- return NULL;
-}
-
-/*
- * get_input - called when incoming data is available.
- */
-static void
-get_input(void)
-{
- int len, i;
- u_char *p;
- u_short protocol;
- struct protent *protp;
-
- p = inpacket_buf; /* point to beginning of packet buffer */
-
- len = read_packet(inpacket_buf);
- if (len < 0)
- return;
-
- if (len == 0) {
- notice("Modem hangup");
- hungup = 1;
- pppd_status = EXIT_HANGUP;
- lcp_lowerdown(0); /* serial link is no longer available */
- link_terminated(0);
- return;
- }
-
- if (debug /*&& (debugflags & DBG_INPACKET)*/)
- dbglog("rcvd %P", p, len);
-
- if (len < PPP_HDRLEN) {
- MAINDEBUG(("io(): Received short packet."));
- return;
- }
-
- p += 2; /* Skip address and control */
- GETSHORT(protocol, p);
- len -= PPP_HDRLEN;
-
- /*
- * Toss all non-LCP packets unless LCP is OPEN.
- */
- if (protocol != PPP_LCP && lcp_fsm[0].state != OPENED) {
- MAINDEBUG(("get_input: Received non-LCP packet when LCP not open."));
- return;
- }
-
- /*
- * Until we get past the authentication phase, toss all packets
- * except LCP, LQR and authentication packets.
- */
- if (pppd_phase <= PHASE_AUTHENTICATE
- && !(protocol == PPP_LCP || protocol == PPP_LQR
- || protocol == PPP_PAP || protocol == PPP_CHAP)) {
- MAINDEBUG(("get_input: discarding proto 0x%x in phase %d",
- protocol, pppd_phase));
- return;
- }
-
- /*
- * Upcall the proper protocol input routine.
- */
- for (i = 0; (protp = protocols[i]) != NULL; ++i) {
- if (protp->protocol == protocol && protp->enabled_flag) {
- (*protp->input)(0, p, len);
- return;
- }
- if (protocol == (protp->protocol & ~0x8000) && protp->enabled_flag
- && protp->datainput != NULL) {
- (*protp->datainput)(0, p, len);
- return;
- }
- }
-
- if (debug) {
- const char *pname = protocol_name(protocol);
- if (pname != NULL)
- warn("Unsupported protocol '%s' (0x%x) received", pname, protocol);
- else
- warn("Unsupported protocol 0x%x received", protocol);
- }
- lcp_sprotrej(0, p - PPP_HDRLEN, len + PPP_HDRLEN);
-
- return;
-}
-
-/*
- * new_phase - signal the start of a new phase of pppd's operation.
- */
-void
-new_phase(p)
- int p;
-{
- pppd_phase = p;
- if (new_phase_hook)
- (*new_phase_hook)(p);
-}
-
-/*
- * die - clean up state and exit with the specified status.
- */
-void
-die(status)
- int status;
-{
- cleanup();
-}
-
-/*
- * cleanup - restore anything which needs to be restored before we exit
- */
-/* ARGSUSED */
-static void
-cleanup()
-{
- sys_cleanup();
-
- if (fd_ppp >= 0)
- disestablish_ppp(pppd_ttyfd);
- if (real_ttyfd >= 0)
- close_tty();
-
- sys_close();
-}
-
-/*
- * close_tty - restore the terminal device and close it.
- */
-static void
-close_tty()
-{
- /* drop dtr to hang up */
- if (!default_device && modem) {
- setdtr(real_ttyfd, 0);
- /*
- * This sleep is in case the serial port has CLOCAL set by default,
- * and consequently will reassert DTR when we close the device.
- */
- sleep(1);
- }
-
- restore_tty(real_ttyfd);
-
- close(real_ttyfd);
- real_ttyfd = -1;
-}
-
-/*
- * update_link_stats - get stats at link termination.
- */
-void
-update_link_stats(u)
- int u;
-{
- struct timeval now;
- char numbuf[32];
-
- if (!get_ppp_stats(u, &link_stats)
- || gettimeofday(&now, NULL) < 0)
- return;
- link_connect_time = now.tv_sec - start_time.tv_sec;
- link_stats_valid = 1;
-
- slprintf(numbuf, sizeof(numbuf), "%d", link_connect_time);
- slprintf(numbuf, sizeof(numbuf), "%d", link_stats.bytes_out);
- slprintf(numbuf, sizeof(numbuf), "%d", link_stats.bytes_in);
-}
-
-struct callout {
- struct timeval c_time; /* time at which to call routine */
- void *c_arg; /* argument to routine */
- void (*c_func) __P((void *)); /* routine */
- struct callout *c_next;
-};
-
-static struct callout *callout = NULL; /* Callout list */
-static struct timeval timenow; /* Current time */
-
-/*
- * timeout - Schedule a timeout.
- *
- * Note that this timeout takes the number of seconds, NOT hz (as in
- * the kernel).
- */
-void
-ppptimeout(func, arg, time)
- void (*func) __P((void *));
- void *arg;
- int time;
-{
- struct callout *newp, *p, **pp;
-
- MAINDEBUG(("Timeout %p:%p in %d seconds.", func, arg, time));
-
- /*
- * Allocate timeout.
- */
- if ((newp = (struct callout *) malloc(sizeof(struct callout))) == NULL)
- fatal("Out of memory in timeout()!");
- newp->c_arg = arg;
- newp->c_func = func;
- gettimeofday(&timenow, NULL);
- newp->c_time.tv_sec = timenow.tv_sec + time;
- newp->c_time.tv_usec = timenow.tv_usec;
-
- /*
- * Find correct place and link it in.
- */
- for (pp = &callout; (p = *pp); pp = &p->c_next)
- if (newp->c_time.tv_sec < p->c_time.tv_sec
- || (newp->c_time.tv_sec == p->c_time.tv_sec
- && newp->c_time.tv_usec < p->c_time.tv_usec))
- break;
- newp->c_next = p;
- *pp = newp;
-}
-
-
-/*
- * untimeout - Unschedule a timeout.
- */
-void
-untimeout(func, arg)
- void (*func) __P((void *));
- void *arg;
-{
- struct callout **copp, *freep;
-
- MAINDEBUG(("Untimeout %p:%p.", func, arg));
-
- /*
- * Find first matching timeout and remove it from the list.
- */
- for (copp = &callout; (freep = *copp); copp = &freep->c_next)
- if (freep->c_func == func && freep->c_arg == arg) {
- *copp = freep->c_next;
- free((char *) freep);
- break;
- }
-}
-
-
-/*
- * calltimeout - Call any timeout routines which are now due.
- */
-static void
-calltimeout()
-{
- struct callout *p;
-
- while (callout != NULL) {
- p = callout;
-
- if (gettimeofday(&timenow, NULL) < 0)
- fatal("Failed to get time of day: %m");
- if (!(p->c_time.tv_sec < timenow.tv_sec
- || (p->c_time.tv_sec == timenow.tv_sec
- && p->c_time.tv_usec <= timenow.tv_usec)))
- break; /* no, it's not time yet */
-
- callout = p->c_next;
- (*p->c_func)(p->c_arg);
-
- free((char *) p);
- }
-}
-
-
-/*
- * timeleft - return the length of time until the next timeout is due.
- */
-static struct timeval *
-timeleft(tvp)
- struct timeval *tvp;
-{
- if (callout == NULL)
- return NULL;
-
- gettimeofday(&timenow, NULL);
- tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec;
- tvp->tv_usec = callout->c_time.tv_usec - timenow.tv_usec;
- if (tvp->tv_usec < 0) {
- tvp->tv_usec += 1000000;
- tvp->tv_sec -= 1;
- }
- if (tvp->tv_sec < 0)
- tvp->tv_sec = tvp->tv_usec = 0;
-
- return tvp;
-}
-
-/*
- * device_script - run a program to talk to the serial device
- * (e.g. to run the connector or disconnector script).
- */
-static int device_script(int fd, int mode, char *program)
-{
- int iReturn = -1;
- char pScript[128];
-
- /* copyt script into temporary location */
- strcpy(pScript, program);
-
- /* check to see if dialer was initialized */
- if ( !pppd_dialer ) {
- /* set default dialer to chatmain */
- pppd_dialer = chatmain;
- }
-
- /* check to see if dialer is set */
- if ( pppd_dialer ) {
- /* call the dialer */
- iReturn = (*pppd_dialer)(fd, mode, program);
- }
-
- return ( -iReturn );
-}
-
-/*
- * novm - log an error message saying we ran out of memory, and die.
- */
-void
-novm(msg)
- char *msg;
-{
- fatal("Virtual memory exhausted allocating %s\n", msg);
-}
diff --git a/c/src/libnetworking/pppd/rtemspppd.c b/c/src/libnetworking/pppd/rtemspppd.c
deleted file mode 100644
index fbe03dd9dc..0000000000
--- a/c/src/libnetworking/pppd/rtemspppd.c
+++ /dev/null
@@ -1,217 +0,0 @@
-
-#include <rtems.h>
-#include <rtems/rtems_bsdnet.h>
-#include "pppd.h"
-#include "rtemspppd.h"
-
-
-/* define pppd function prototypes */
-extern void pppasyncattach(void);
-extern int pppdmain(int, char **);
-
-/* define global variables */
-rtems_id rtems_pppd_taskid;
-rtems_pppd_hookfunction rtems_pppd_errorfp;
-rtems_pppd_hookfunction rtems_pppd_exitfp;
-
-
-static rtems_task pppTask(rtems_task_argument arg)
-{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- rtems_option options;
- rtems_event_set in;
- rtems_event_set out;
- int iStatus;
-
- /* call function to setup ppp line discipline */
- pppasyncattach();
-
- /* enter processing loop */
- in = (RTEMS_EVENT_29 | RTEMS_EVENT_30);
- options = (RTEMS_EVENT_ANY | RTEMS_WAIT);
- while ( sc == RTEMS_SUCCESSFUL ) {
- /* wait for the next event */
- sc = rtems_event_receive(in, options, RTEMS_NO_TIMEOUT, &out);
- if ( sc == RTEMS_SUCCESSFUL ) {
- /* determine which event was sent */
- if ( out & RTEMS_EVENT_29 ) {
- /* terminate event received */
- /* set value to break out of event loop */
- sc = RTEMS_UNSATISFIED;
- }
- else if ( out & RTEMS_EVENT_30 ) {
- /* connect request */
- /* execute the pppd main code */
- iStatus = pppdmain(0, NULL);
- if ( iStatus == EXIT_OK ) {
- /* check exit callback */
- if ( rtems_pppd_exitfp ) {
- (*rtems_pppd_exitfp)();
- }
- }
- else {
- /* check error callback */
- if ( rtems_pppd_errorfp ) {
- (*rtems_pppd_errorfp)();
- }
- }
- }
- }
- }
-
- /* terminate myself */
- rtems_pppd_taskid = 0;
- rtems_task_delete(RTEMS_SELF);
-}
-
-int rtems_pppd_initialize(void)
-{
- int iReturn = (int)-1;
- rtems_task_priority priority = 100;
- rtems_status_code status;
- rtems_name taskName;
-
- /* determine priority value */
- if ( rtems_bsdnet_config.network_task_priority ) {
- priority = rtems_bsdnet_config.network_task_priority;
- }
-
- /* initialize the exit hook */
- rtems_pppd_exitfp = (rtems_pppd_hookfunction)0;
-
- /* create the rtems task */
- taskName = rtems_build_name( 'p', 'p', 'p', 'd' );
- status = rtems_task_create(taskName, priority, 8192,
- (RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0)),
- RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
- &rtems_pppd_taskid);
- if ( status == RTEMS_SUCCESSFUL ) {
- status = rtems_task_start(rtems_pppd_taskid, pppTask, 0);
- if ( status == RTEMS_SUCCESSFUL ) {
- iReturn = rtems_pppd_reset_options();
- }
- }
-
- return ( iReturn );
-}
-
-int rtems_pppd_terminate(void)
-{
- /* send terminate signal to pppd task */
- rtems_event_send(rtems_pppd_taskid, RTEMS_EVENT_29);
-
- /* call the disconnect function */
- rtems_pppd_disconnect();
-
- return ( 0 );
-}
-
-int rtems_pppd_reset_options(void)
-{
- int i;
- struct protent *protp;
-
- /*
- * Initialize to the standard option set, then parse, in order,
- * the system options file, the user's options file,
- * the tty's options file, and the command line arguments.
- */
- for (i = 0; (protp = protocols[i]) != NULL; ++i)
- (*protp->init)(0);
-
- return ( 0 );
-}
-
-int rtems_pppd_set_hook(int id, rtems_pppd_hookfunction hookfp)
-{
- int iReturn = (int)0;
-
- switch ( id ) {
- case RTEMS_PPPD_LINKUP_HOOK:
- auth_linkup_hook = hookfp;
- break;
- case RTEMS_PPPD_LINKDOWN_HOOK:
- auth_linkdown_hook = hookfp;
- break;
- case RTEMS_PPPD_IPUP_HOOK:
- ip_up_hook = hookfp;
- break;
- case RTEMS_PPPD_IPDOWN_HOOK:
- ip_down_hook = hookfp;
- break;
- case RTEMS_PPPD_ERROR_HOOK:
- rtems_pppd_errorfp = hookfp;
- break;
- case RTEMS_PPPD_EXIT_HOOK:
- rtems_pppd_exitfp = hookfp;
- break;
- default:
- iReturn = (int)-1;
- break;
- }
-
- return ( iReturn );
-}
-
-int rtems_pppd_set_dialer(rtems_pppd_dialerfunction dialerfp)
-{
- pppd_dialer = dialerfp;
- return ( (int)0 );
-}
-
-int rtems_pppd_set_option(const char *pOption, const char *pValue)
-{
- int iReturn = (int)0;
- int prevPhase;
- struct wordlist option;
- struct wordlist value;
-
- if ( pOption != (const char *)0 ) {
- /* initialize the values */
- option.word = (char *)pOption;
- option.next = (struct wordlist *)0;
- if ( pValue != (const char *)0 ) {
- option.next = &value;
- value.word = (char *)pValue;
- value.next = (struct wordlist *)0;
- }
-
- /* save current phase value */
- prevPhase = pppd_phase;
- pppd_phase = PHASE_INITIALIZE;
-
- /* process option and reset phase value */
- iReturn = options_from_list(&option, 1);
- pppd_phase = prevPhase;
- }
-
- return ( iReturn );
-}
-
-int rtems_pppd_connect(void)
-{
- /* send connect signal to pppd task */
- rtems_event_send(rtems_pppd_taskid, RTEMS_EVENT_30);
-
- return ( 0 );
-}
-
-static void timeout_terminate(void *arg)
-{
- /* set pppd global variables to disconnect */
- persist = 0;
- pppd_kill_link = 1;
-}
-
-int rtems_pppd_disconnect(void)
-{
- /* need to wait a little time before we can bring the link down */
- /* set up time out in 1 seconds */
- TIMEOUT(timeout_terminate, NULL, 1);
-
- /* send event to wake up the pppd code */
- /* pretend its a serial interrput */
- rtems_event_send(rtems_pppd_taskid, RTEMS_EVENT_31);
-
- return ( 0 );
-}
diff --git a/c/src/libnetworking/pppd/rtemspppd.h b/c/src/libnetworking/pppd/rtemspppd.h
deleted file mode 100644
index f60916e2ee..0000000000
--- a/c/src/libnetworking/pppd/rtemspppd.h
+++ /dev/null
@@ -1,29 +0,0 @@
-
-#ifndef RTEMSPPPD_H
-#define RTEMSPPPD_H
-
-
-/* define hook function identifiers */
-#define RTEMS_PPPD_LINKUP_HOOK 1
-#define RTEMS_PPPD_LINKDOWN_HOOK 2
-#define RTEMS_PPPD_IPUP_HOOK 3
-#define RTEMS_PPPD_IPDOWN_HOOK 4
-#define RTEMS_PPPD_ERROR_HOOK 5
-#define RTEMS_PPPD_EXIT_HOOK 6
-
-/* define hook function pointer prototype */
-typedef void (*rtems_pppd_hookfunction)(void);
-typedef int (*rtems_pppd_dialerfunction)(int tty, int mode, char *pScript);
-
-
-/* define pppd function prototyes */
-int rtems_pppd_initialize(void);
-int rtems_pppd_terminate(void);
-int rtems_pppd_reset_options(void);
-int rtems_pppd_set_hook(int id, rtems_pppd_hookfunction hookfp);
-int rtems_pppd_set_dialer(rtems_pppd_dialerfunction dialerfp);
-int rtems_pppd_set_option(const char *pOption, const char *pValue);
-int rtems_pppd_connect(void);
-int rtems_pppd_disconnect(void);
-
-#endif
diff --git a/c/src/libnetworking/pppd/sys-rtems.c b/c/src/libnetworking/pppd/sys-rtems.c
deleted file mode 100644
index 79580482ff..0000000000
--- a/c/src/libnetworking/pppd/sys-rtems.c
+++ /dev/null
@@ -1,1338 +0,0 @@
-/*
- * sys-bsd.c - System-dependent procedures for setting up
- * PPP interfaces on bsd-4.4-ish systems (including 386BSD, NetBSD, etc.)
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * Copyright (c) 1995 The Australian National University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University and The Australian National University.
- * The names of the Universities may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#define RCSID "$Id$"
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <termios.h>
-#include <signal.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#ifdef PPP_FILTER
-#include <net/bpf.h>
-#endif
-
-#include <net/if.h>
-#include <net/ppp_defs.h>
-#include <net/if_ppp.h>
-#include <net/route.h>
-#include <net/if_dl.h>
-#include <netinet/in.h>
-
-#if RTM_VERSION >= 3
-#include <sys/param.h>
-#if defined(NetBSD) && (NetBSD >= 199703)
-#include <netinet/if_inarp.h>
-#else /* NetBSD 1.2D or later */
-#include <netinet/if_ether.h>
-#endif
-#endif
-
-#include <rtems.h>
-#include <rtems/rtems_bsdnet.h>
-#include <rtems/termiostypes.h>
-extern int rtems_bsdnet_microseconds_per_tick;
-extern rtems_id rtems_pppd_taskid;
-
-#include "pppd.h"
-#include "fsm.h"
-#include "ipcp.h"
-
-static const char rcsid[] = RCSID;
-
-
-static int initdisc = -1; /* Initial TTY discipline for ppp_fd */
-static int initfdflags = -1; /* Initial file descriptor flags for ppp_fd */
-static int ppp_fd = -1; /* fd which is set to PPP discipline */
-static int rtm_seq;
-
-static int restore_term; /* 1 => we've munged the terminal */
-static struct termios inittermios; /* Initial TTY termios */
-static struct winsize wsinfo; /* Initial window size info */
-
-static int loop_slave = -1;
-static int loop_master;
-
-static unsigned char inbuf[512]; /* buffer for chars read from loopback */
-
-static int sockfd; /* socket for doing interface ioctls */
-
-static int if_is_up; /* the interface is currently up */
-static u_int32_t ifaddrs[2]; /* local and remote addresses we set */
-static u_int32_t default_route_gateway; /* gateway addr for default route */
-static u_int32_t proxy_arp_addr; /* remote addr for proxy arp */
-
-/* Prototypes for procedures local to this file. */
-static int dodefaultroute __P((u_int32_t, int));
-static int get_ether_addr __P((u_int32_t, struct sockaddr_dl *));
-
-
-/*
- * sys_init - System-dependent initialization.
- */
-void
-sys_init()
-{
- /* Get an internet socket for doing socket ioctl's on. */
- if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
- fatal("Couldn't create IP socket: %m");
-}
-
-/*
- * sys_cleanup - restore any system state we modified before exiting:
- * mark the interface down, delete default route and/or proxy arp entry.
- * This should call die() because it's called from die().
- */
-void
-sys_cleanup()
-{
- struct ifreq ifr;
-
- if (if_is_up) {
- strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
- if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) >= 0
- && ((ifr.ifr_flags & IFF_UP) != 0)) {
- ifr.ifr_flags &= ~IFF_UP;
- ioctl(sockfd, SIOCSIFFLAGS, &ifr);
- }
- }
- if (ifaddrs[0] != 0)
- cifaddr(0, ifaddrs[0], ifaddrs[1]);
- if (default_route_gateway)
- cifdefaultroute(0, 0, default_route_gateway);
- if (proxy_arp_addr)
- cifproxyarp(0, proxy_arp_addr);
-}
-
-/*
- * sys_close - Clean up in a child process before execing.
- */
-void
-sys_close()
-{
- close(sockfd);
- if (loop_slave >= 0) {
- close(loop_slave);
- close(loop_master);
- }
-}
-
-/*
- * sys_check_options - check the options that the user specified
- */
-int
-sys_check_options()
-{
- return 1;
-}
-
-/*
- * ppp_available - check whether the system has any ppp interfaces
- * (in fact we check whether we can do an ioctl on ppp0).
- */
-int
-ppp_available()
-{
- int s, ok;
- struct ifreq ifr;
-
- if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
- return 1; /* can't tell */
-
- strlcpy(ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name));
- ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0;
- close(s);
-
- return ok;
-}
-
-/*
- * establish_ppp - Turn the serial port into a ppp interface.
- */
-int
-establish_ppp(fd)
- int fd;
-{
- int taskid = (int)rtems_pppd_taskid;
- int pppdisc = PPPDISC;
- int x;
-
- if (demand) {
- /*
- * Demand mode - prime the old ppp device to relinquish the unit.
- */
- if (ioctl(ppp_fd, PPPIOCXFERUNIT, 0) < 0)
- fatal("ioctl(transfer ppp unit): %m");
- }
-
- /*
- * Save the old line discipline of fd, and set it to PPP.
- */
- if (ioctl(fd, TIOCGETD, &initdisc) < 0)
- fatal("ioctl(TIOCGETD): %m");
- if (ioctl(fd, TIOCSETD, &pppdisc) < 0)
- fatal("ioctl(TIOCSETD): %m");
-
- /* set pppd taskid into the driver */
- ioctl(fd, PPPIOCSTASK, &taskid);
-
- if (!demand) {
- /*
- * Find out which interface we were given.
- */
- if (ioctl(fd, PPPIOCGUNIT, &pppifunit) < 0)
- fatal("ioctl(PPPIOCGUNIT): %m");
- } else {
- /*
- * Check that we got the same unit again.
- */
- if (ioctl(fd, PPPIOCGUNIT, &x) < 0)
- fatal("ioctl(PPPIOCGUNIT): %m");
- if (x != pppifunit)
- fatal("transfer_ppp failed: wanted unit %d, got %d", pppifunit, x);
- x = TTYDISC;
- ioctl(loop_slave, TIOCSETD, &x);
- }
-
- ppp_fd = fd;
-
- /*
- * Enable debug in the driver if requested.
- */
- if (kdebugflag) {
- if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) {
- warn("ioctl (PPPIOCGFLAGS): %m");
- } else {
- x |= (kdebugflag & 0xFF) * SC_DEBUG;
- if (ioctl(fd, PPPIOCSFLAGS, (caddr_t) &x) < 0)
- warn("ioctl(PPPIOCSFLAGS): %m");
- }
- }
-
- /*
- * Set device for non-blocking reads.
- */
- if ((initfdflags = fcntl(fd, F_GETFL)) == -1
- || fcntl(fd, F_SETFL, initfdflags | O_NONBLOCK) == -1) {
- warn("Couldn't set device to non-blocking mode: %m");
- }
-
- return fd;
-}
-
-/*
- * restore_loop - reattach the ppp unit to the loopback.
- */
-void
-restore_loop()
-{
- int x;
-
- /*
- * Transfer the ppp interface back to the loopback.
- */
- if (ioctl(ppp_fd, PPPIOCXFERUNIT, 0) < 0)
- fatal("ioctl(transfer ppp unit): %m");
- x = PPPDISC;
- if (ioctl(loop_slave, TIOCSETD, &x) < 0)
- fatal("ioctl(TIOCSETD): %m");
-
- /*
- * Check that we got the same unit again.
- */
- if (ioctl(loop_slave, PPPIOCGUNIT, &x) < 0)
- fatal("ioctl(PPPIOCGUNIT): %m");
- if (x != pppifunit)
- fatal("transfer_ppp failed: wanted unit %d, got %d", pppifunit, x);
- ppp_fd = loop_slave;
-}
-
-
-/*
- * disestablish_ppp - Restore the serial port to normal operation.
- * This shouldn't call die() because it's called from die().
- */
-void
-disestablish_ppp(fd)
- int fd;
-{
- int taskid = (int)0;
-
- /* clear pppd taskid from the driver */
- ioctl(fd, PPPIOCSTASK, &taskid);
-
- /* Reset non-blocking mode on fd. */
- if (initfdflags != -1 && fcntl(fd, F_SETFL, initfdflags) < 0)
- warn("Couldn't restore device fd flags: %m");
- initfdflags = -1;
-
- /* Restore old line discipline. */
- if (initdisc >= 0 && ioctl(fd, TIOCSETD, &initdisc) < 0)
- error("ioctl(TIOCSETD): %m");
- initdisc = -1;
-
- if (fd == ppp_fd)
- ppp_fd = -1;
-}
-
-/*
- * Check whether the link seems not to be 8-bit clean.
- */
-void
-clean_check()
-{
- int x;
- char *s;
-
- if (ioctl(ppp_fd, PPPIOCGFLAGS, (caddr_t) &x) == 0) {
- s = NULL;
- switch (~x & (SC_RCV_B7_0|SC_RCV_B7_1|SC_RCV_EVNP|SC_RCV_ODDP)) {
- case SC_RCV_B7_0:
- s = "bit 7 set to 1";
- break;
- case SC_RCV_B7_1:
- s = "bit 7 set to 0";
- break;
- case SC_RCV_EVNP:
- s = "odd parity";
- break;
- case SC_RCV_ODDP:
- s = "even parity";
- break;
- }
- if (s != NULL) {
- warn("Serial link is not 8-bit clean:");
- warn("All received characters had %s", s);
- }
- }
-}
-
-/*
- * set_up_tty: Set up the serial port on `fd' for 8 bits, no parity,
- * at the requested speed, etc. If `local' is true, set CLOCAL
- * regardless of whether the modem option was specified.
- *
- * For *BSD, we assume that speed_t values numerically equal bits/second.
- */
-void
-set_up_tty(fd, local)
- int fd, local;
-{
- struct termios tios;
-
- if (tcgetattr(fd, &tios) < 0)
- fatal("tcgetattr: %m");
-
- if (!restore_term) {
- inittermios = tios;
- ioctl(fd, TIOCGWINSZ, &wsinfo);
- }
-
- tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB | CLOCAL);
- if (crtscts > 0 && !local) {
- if (crtscts == 2) {
-#ifdef CDTRCTS
- tios.c_cflag |= CDTRCTS;
-#endif
- } else
- tios.c_cflag |= CRTSCTS;
- } else if (crtscts < 0) {
- tios.c_cflag &= ~CRTSCTS;
-#ifdef CDTRCTS
- tios.c_cflag &= ~CDTRCTS;
-#endif
- }
-
- tios.c_cflag |= CS8 | CREAD | HUPCL;
- if (local || !modem)
- tios.c_cflag |= CLOCAL;
- tios.c_iflag = IGNBRK | IGNPAR;
- tios.c_oflag = 0;
- tios.c_lflag = 0;
- tios.c_cc[VMIN] = 1;
- tios.c_cc[VTIME] = 0;
-
- if (crtscts == -2) {
- tios.c_iflag |= IXON | IXOFF;
- tios.c_cc[VSTOP] = 0x13; /* DC3 = XOFF = ^S */
- tios.c_cc[VSTART] = 0x11; /* DC1 = XON = ^Q */
- }
-
- if (inspeed) {
- cfsetospeed(&tios, inspeed);
- cfsetispeed(&tios, inspeed);
- } else {
- inspeed = cfgetospeed(&tios);
- /*
- * We can't proceed if the serial port speed is 0,
- * since that implies that the serial port is disabled.
- */
- if (inspeed == 0)
- fatal("Baud rate for %s is 0; need explicit baud rate", devnam);
- }
- baud_rate = inspeed;
-
-/* if (tcsetattr(fd, TCSAFLUSH, &tios) < 0) { */
- if (tcsetattr(fd, TCSADRAIN, &tios) < 0) {
- fatal("tcsetattr: %m");
- }
-
- restore_term = 1;
-}
-
-/*
- * restore_tty - restore the terminal to the saved settings.
- */
-void
-restore_tty(fd)
- int fd;
-{
- if (restore_term) {
- if (!default_device) {
- /*
- * Turn off echoing, because otherwise we can get into
- * a loop with the tty and the modem echoing to each other.
- * We presume we are the sole user of this tty device, so
- * when we close it, it will revert to its defaults anyway.
- */
- inittermios.c_lflag &= ~(ECHO | ECHONL);
- }
-/* if (tcsetattr(fd, TCSAFLUSH, &inittermios) < 0) { */
- if (tcsetattr(fd, TCSADRAIN, &inittermios) < 0) {
- if (errno != ENXIO)
- warn("tcsetattr: %m");
- }
- ioctl(fd, TIOCSWINSZ, &wsinfo);
- restore_term = 0;
- }
-}
-
-/*
- * setdtr - control the DTR line on the serial port.
- * This is called from die(), so it shouldn't call die().
- */
-void
-setdtr(fd, on)
-int fd, on;
-{
- int modembits = TIOCM_DTR;
-
- ioctl(fd, (on? TIOCMBIS: TIOCMBIC), &modembits);
-}
-
-/*
- * get_pty - get a pty master/slave pair and chown the slave side
- * to the uid given. Assumes slave_name points to >= 12 bytes of space.
- */
-int
-get_pty(master_fdp, slave_fdp, slave_name, uid)
- int *master_fdp;
- int *slave_fdp;
- char *slave_name;
- int uid;
-{
- return 1;
-}
-
-
-/*
- * open_ppp_loopback - open the device we use for getting
- * packets in demand mode, and connect it to a ppp interface.
- * Here we use a pty.
- */
-int
-open_ppp_loopback()
-{
- return loop_master;
-}
-
-
-/*
- * output - Output PPP packet.
- */
-void
-output(unit, p, len)
- int unit;
- u_char *p;
- int len;
-{
- if (debug);
- dbglog("sent %P", p, len);
-/* printf("sent packet [%d]\n", len); */
-
- if (write(pppd_ttyfd, p, len) < 0) {
- if (errno != EIO)
- error("write: %m");
- }
-}
-
-void
-ppp_delay(void)
-{
- rtems_interval ticks;
-
- /* recommended delay to help negotiation */
- ticks = 300000/rtems_bsdnet_microseconds_per_tick;
- rtems_task_wake_after(ticks);
-}
-
-/*
- * wait_input - wait until there is data available,
- * for the length of time specified by *timo (indefinite
- * if timo is NULL).
- */
-void
-wait_input(timo)
- struct timeval *timo;
-{
- rtems_event_set events;
- rtems_interval ticks = 0;
- rtems_option wait = RTEMS_WAIT;
-
- if(timo) {
- if(timo->tv_sec == 0 && timo->tv_usec == 0)
- wait = RTEMS_NO_WAIT;
- else {
- ticks = (timo->tv_sec * 1000000 + timo->tv_usec) /
- rtems_bsdnet_microseconds_per_tick;
- if(ticks <= 0)
- ticks = 1;
- }
- }
- rtems_event_receive(RTEMS_EVENT_31, RTEMS_EVENT_ANY | wait, ticks, &events);
-}
-
-/*
- * read_packet - get a PPP packet from the serial device.
- */
-int
-read_packet(buf)
- u_char *buf;
-{
- int len;
-
- if ((len = read(pppd_ttyfd, buf, PPP_MTU + PPP_HDRLEN)) < 0) {
- if (errno == EWOULDBLOCK || errno == EINTR) len = -1;
- /*fatal("read: %m"); */
- }
-
-/* printf("read packet [%d]\n", len); */
- return len;
-}
-
-
-/*
- * get_loop_output - read characters from the loopback, form them
- * into frames, and detect when we want to bring the real link up.
- * Return value is 1 if we need to bring up the link, 0 otherwise.
- */
-int
-get_loop_output()
-{
- int rv = 0;
- int n;
-
- while ((n = read(loop_master, inbuf, sizeof(inbuf))) >= 0) {
- if (loop_chars(inbuf, n))
- rv = 1;
- }
-
- if (n == 0)
- fatal("eof on loopback");
- if (errno != EWOULDBLOCK)
- fatal("read from loopback: %m");
-
- return rv;
-}
-
-
-/*
- * ppp_send_config - configure the transmit characteristics of
- * the ppp interface.
- */
-void
-ppp_send_config(unit, mtu, asyncmap, pcomp, accomp)
- int unit, mtu;
- u_int32_t asyncmap;
- int pcomp, accomp;
-{
- u_int x;
- struct ifreq ifr;
-
- strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
- ifr.ifr_mtu = mtu;
- if (ioctl(sockfd, SIOCSIFMTU, (caddr_t) &ifr) < 0)
- fatal("ioctl(SIOCSIFMTU): %m");
-
- if (ioctl(ppp_fd, PPPIOCSASYNCMAP, (caddr_t) &asyncmap) < 0)
- fatal("ioctl(PPPIOCSASYNCMAP): %m");
-
- if (ioctl(ppp_fd, PPPIOCGFLAGS, (caddr_t) &x) < 0)
- fatal("ioctl (PPPIOCGFLAGS): %m");
- x = pcomp? x | SC_COMP_PROT: x &~ SC_COMP_PROT;
- x = accomp? x | SC_COMP_AC: x &~ SC_COMP_AC;
-/* x = sync_serial ? x | SC_SYNC : x & ~SC_SYNC; */
- if (ioctl(ppp_fd, PPPIOCSFLAGS, (caddr_t) &x) < 0)
- fatal("ioctl(PPPIOCSFLAGS): %m");
-}
-
-
-/*
- * ppp_set_xaccm - set the extended transmit ACCM for the interface.
- */
-void
-ppp_set_xaccm(unit, accm)
- int unit;
- ext_accm accm;
-{
- if (ioctl(ppp_fd, PPPIOCSXASYNCMAP, accm) < 0 && errno != ENOTTY)
- warn("ioctl(set extended ACCM): %m");
-}
-
-
-/*
- * ppp_recv_config - configure the receive-side characteristics of
- * the ppp interface.
- */
-void
-ppp_recv_config(unit, mru, asyncmap, pcomp, accomp)
- int unit, mru;
- u_int32_t asyncmap;
- int pcomp, accomp;
-{
- int x;
-
- if (ioctl(ppp_fd, PPPIOCSMRU, (caddr_t) &mru) < 0)
- fatal("ioctl(PPPIOCSMRU): %m");
- if (ioctl(ppp_fd, PPPIOCSRASYNCMAP, (caddr_t) &asyncmap) < 0)
- fatal("ioctl(PPPIOCSRASYNCMAP): %m");
- if (ioctl(ppp_fd, PPPIOCGFLAGS, (caddr_t) &x) < 0)
- fatal("ioctl (PPPIOCGFLAGS): %m");
- x = !accomp? x | SC_REJ_COMP_AC: x &~ SC_REJ_COMP_AC;
- if (ioctl(ppp_fd, PPPIOCSFLAGS, (caddr_t) &x) < 0)
- fatal("ioctl(PPPIOCSFLAGS): %m");
-}
-
-/*
- * ccp_test - ask kernel whether a given compression method
- * is acceptable for use. Returns 1 if the method and parameters
- * are OK, 0 if the method is known but the parameters are not OK
- * (e.g. code size should be reduced), or -1 if the method is unknown.
- */
-int
-ccp_test(unit, opt_ptr, opt_len, for_transmit)
- int unit, opt_len, for_transmit;
- u_char *opt_ptr;
-{
- struct ppp_option_data data;
-
- data.ptr = opt_ptr;
- data.length = opt_len;
- data.transmit = for_transmit;
- if (ioctl(pppd_ttyfd, PPPIOCSCOMPRESS, (caddr_t) &data) >= 0)
- return 1;
- return (errno == ENOBUFS)? 0: -1;
-}
-
-/*
- * ccp_flags_set - inform kernel about the current state of CCP.
- */
-void
-ccp_flags_set(unit, isopen, isup)
- int unit, isopen, isup;
-{
- int x;
-
- if (ioctl(ppp_fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) {
- error("ioctl (PPPIOCGFLAGS): %m");
- return;
- }
- x = isopen? x | SC_CCP_OPEN: x &~ SC_CCP_OPEN;
- x = isup? x | SC_CCP_UP: x &~ SC_CCP_UP;
- if (ioctl(ppp_fd, PPPIOCSFLAGS, (caddr_t) &x) < 0)
- error("ioctl(PPPIOCSFLAGS): %m");
-}
-
-/*
- * ccp_fatal_error - returns 1 if decompression was disabled as a
- * result of an error detected after decompression of a packet,
- * 0 otherwise. This is necessary because of patent nonsense.
- */
-int
-ccp_fatal_error(unit)
- int unit;
-{
- int x;
-
- if (ioctl(ppp_fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) {
- error("ioctl(PPPIOCGFLAGS): %m");
- return 0;
- }
- return x & SC_DC_FERROR;
-}
-
-/*
- * get_idle_time - return how long the link has been idle.
- */
-int
-get_idle_time(u, ip)
- int u;
- struct ppp_idle *ip;
-{
- return ioctl(ppp_fd, PPPIOCGIDLE, ip) >= 0;
-}
-
-/*
- * get_ppp_stats - return statistics for the link.
- */
-int
-get_ppp_stats(u, stats)
- int u;
- struct pppd_stats *stats;
-{
- struct ifpppstatsreq req;
-
- memset (&req, 0, sizeof (req));
- strlcpy(req.ifr_name, ifname, sizeof(req.ifr_name));
- if (ioctl(sockfd, SIOCGPPPSTATS, &req) < 0) {
- error("Couldn't get PPP statistics: %m");
- return 0;
- }
- stats->bytes_in = req.stats.p.ppp_ibytes;
- stats->bytes_out = req.stats.p.ppp_obytes;
- return 1;
-}
-
-
-#ifdef PPP_FILTER
-/*
- * set_filters - transfer the pass and active filters to the kernel.
- */
-int
-set_filters(pass, active)
- struct bpf_program *pass, *active;
-{
- int ret = 1;
-
- if (pass->bf_len > 0) {
- if (ioctl(ppp_fd, PPPIOCSPASS, pass) < 0) {
- error("Couldn't set pass-filter in kernel: %m");
- ret = 0;
- }
- }
- if (active->bf_len > 0) {
- if (ioctl(ppp_fd, PPPIOCSACTIVE, active) < 0) {
- error("Couldn't set active-filter in kernel: %m");
- ret = 0;
- }
- }
- return ret;
-}
-#endif
-
-/*
- * sifvjcomp - config tcp header compression
- */
-int
-sifvjcomp(u, vjcomp, cidcomp, maxcid)
- int u, vjcomp, cidcomp, maxcid;
-{
- u_int x;
-
- if (ioctl(ppp_fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) {
- error("ioctl (PPPIOCGFLAGS): %m");
- return 0;
- }
- x = vjcomp ? x | SC_COMP_TCP: x &~ SC_COMP_TCP;
- x = cidcomp? x & ~SC_NO_TCP_CCID: x | SC_NO_TCP_CCID;
- if (ioctl(ppp_fd, PPPIOCSFLAGS, (caddr_t) &x) < 0) {
- error("ioctl(PPPIOCSFLAGS): %m");
- return 0;
- }
- if (vjcomp && ioctl(ppp_fd, PPPIOCSMAXCID, (caddr_t) &maxcid) < 0) {
- error("ioctl(PPPIOCSFLAGS): %m");
- return 0;
- }
- return 1;
-}
-
-/*
- * sifup - Config the interface up and enable IP packets to pass.
- */
-int
-sifup(u)
- int u;
-{
- struct ifreq ifr;
-
- strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
- if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
- error("ioctl (SIOCGIFFLAGS): %m");
- return 0;
- }
- ifr.ifr_flags |= IFF_UP;
- if (ioctl(sockfd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
- error("ioctl(SIOCSIFFLAGS): %m");
- return 0;
- }
- if_is_up = 1;
- return 1;
-}
-
-/*
- * sifnpmode - Set the mode for handling packets for a given NP.
- */
-int
-sifnpmode(u, proto, mode)
- int u;
- int proto;
- enum NPmode mode;
-{
- struct npioctl npi;
-
- npi.protocol = proto;
- npi.mode = mode;
- if (ioctl(ppp_fd, PPPIOCSNPMODE, &npi) < 0) {
- error("ioctl(set NP %d mode to %d): %m", proto, mode);
- return 0;
- }
- return 1;
-}
-
-/*
- * sifdown - Config the interface down and disable IP.
- */
-int
-sifdown(u)
- int u;
-{
- struct ifreq ifr;
- int rv;
- struct npioctl npi;
-
- rv = 1;
- npi.protocol = PPP_IP;
- npi.mode = NPMODE_ERROR;
- ioctl(ppp_fd, PPPIOCSNPMODE, (caddr_t) &npi);
- /* ignore errors, because ppp_fd might have been closed by now. */
-
- strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
- if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
- error("ioctl (SIOCGIFFLAGS): %m");
- rv = 0;
- } else {
- ifr.ifr_flags &= ~IFF_UP;
- if (ioctl(sockfd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
- error("ioctl(SIOCSIFFLAGS): %m");
- rv = 0;
- } else
- if_is_up = 0;
- }
- return rv;
-}
-
-/*
- * SET_SA_FAMILY - set the sa_family field of a struct sockaddr,
- * if it exists.
- */
-#define SET_SA_FAMILY(addr, family) \
- BZERO((char *) &(addr), sizeof(addr)); \
- addr.sa_family = (family); \
- addr.sa_len = sizeof(addr);
-
-/*
- * sifaddr - Config the interface IP addresses and netmask.
- */
-int
-sifaddr(u, o, h, m)
- int u;
- u_int32_t o, h, m;
-{
- struct ifaliasreq ifra;
- struct ifreq ifr;
-
- strlcpy(ifra.ifra_name, ifname, sizeof(ifra.ifra_name));
- SET_SA_FAMILY(ifra.ifra_addr, AF_INET);
- ((struct sockaddr_in *) &ifra.ifra_addr)->sin_addr.s_addr = o;
- SET_SA_FAMILY(ifra.ifra_broadaddr, AF_INET);
- ((struct sockaddr_in *) &ifra.ifra_broadaddr)->sin_addr.s_addr = h;
- if (m != 0) {
- SET_SA_FAMILY(ifra.ifra_mask, AF_INET);
- ((struct sockaddr_in *) &ifra.ifra_mask)->sin_addr.s_addr = m;
- } else
- BZERO(&ifra.ifra_mask, sizeof(ifra.ifra_mask));
- BZERO(&ifr, sizeof(ifr));
- strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
- if (ioctl(sockfd, SIOCDIFADDR, (caddr_t) &ifr) < 0) {
- if (errno != EADDRNOTAVAIL)
- warn("Couldn't remove interface address: %m");
- }
- if (ioctl(sockfd, SIOCAIFADDR, (caddr_t) &ifra) < 0) {
- if (errno != EEXIST) {
- error("Couldn't set interface address: %m");
- return 0;
- }
- warn("Couldn't set interface address: Address %I already exists", o);
- }
- ifaddrs[0] = o;
- ifaddrs[1] = h;
- return 1;
-}
-
-/*
- * cifaddr - Clear the interface IP addresses, and delete routes
- * through the interface if possible.
- */
-int
-cifaddr(u, o, h)
- int u;
- u_int32_t o, h;
-{
- struct ifaliasreq ifra;
-
- ifaddrs[0] = 0;
- strlcpy(ifra.ifra_name, ifname, sizeof(ifra.ifra_name));
- SET_SA_FAMILY(ifra.ifra_addr, AF_INET);
- ((struct sockaddr_in *) &ifra.ifra_addr)->sin_addr.s_addr = o;
- SET_SA_FAMILY(ifra.ifra_broadaddr, AF_INET);
- ((struct sockaddr_in *) &ifra.ifra_broadaddr)->sin_addr.s_addr = h;
- BZERO(&ifra.ifra_mask, sizeof(ifra.ifra_mask));
- if (ioctl(sockfd, SIOCDIFADDR, (caddr_t) &ifra) < 0) {
- if (errno != EADDRNOTAVAIL)
- warn("Couldn't delete interface address: %m");
- return 0;
- }
- return 1;
-}
-
-/*
- * sifdefaultroute - assign a default route through the address given.
- */
-int
-sifdefaultroute(u, l, g)
- int u;
- u_int32_t l, g;
-{
- return dodefaultroute(g, 's');
-}
-
-/*
- * cifdefaultroute - delete a default route through the address given.
- */
-int
-cifdefaultroute(u, l, g)
- int u;
- u_int32_t l, g;
-{
- return dodefaultroute(g, 'c');
-}
-
-/*
- * dodefaultroute - talk to a routing socket to add/delete a default route.
- */
-static int
-dodefaultroute(g, cmd)
- u_int32_t g;
- int cmd;
-{
-/* int status; */
- struct sockaddr_in address;
- struct sockaddr_in netmask;
- struct sockaddr_in gateway;
-
- memset((void *) &address, 0, sizeof(address));
- address.sin_len = sizeof address;
- address.sin_family = AF_INET;
- address.sin_addr.s_addr = INADDR_ANY;
-
- memset((void *) &netmask, 0, sizeof(netmask));
- netmask.sin_len = sizeof netmask;
- netmask.sin_addr.s_addr = INADDR_ANY;
- netmask.sin_family = AF_INET;
-
- if (cmd=='s') {
- memset((void *) &gateway, 0, sizeof(gateway));
- gateway.sin_len = sizeof gateway;
- gateway.sin_family = AF_INET;
- gateway.sin_addr.s_addr = g;
-
- rtems_bsdnet_rtrequest(RTM_ADD,
- (struct sockaddr *)&address,
- (struct sockaddr *)&gateway,
- (struct sockaddr *)&netmask,
- (RTF_UP|RTF_GATEWAY|RTF_STATIC), NULL);
- }
- else {
- memset((void *) &gateway, 0, sizeof(gateway));
- gateway.sin_len = sizeof gateway;
- gateway.sin_family = AF_INET;
- gateway.sin_addr.s_addr = INADDR_ANY;
-
- rtems_bsdnet_rtrequest(RTM_DELETE,
- (struct sockaddr *)&address,
- (struct sockaddr *)&gateway,
- (struct sockaddr *)&netmask,
- (RTF_UP|RTF_STATIC), NULL);
- }
-
- default_route_gateway = (cmd == 's')? g: 0;
-
- return 1;
-}
-
-#if RTM_VERSION >= 3
-
-/*
- * sifproxyarp - Make a proxy ARP entry for the peer.
- */
-static struct {
- struct rt_msghdr hdr;
- struct sockaddr_inarp dst;
- struct sockaddr_dl hwa;
- char extra[128];
-} arpmsg;
-
-static int arpmsg_valid;
-
-int
-sifproxyarp(unit, hisaddr)
- int unit;
- u_int32_t hisaddr;
-{
- int routes;
-
- /*
- * Get the hardware address of an interface on the same subnet
- * as our local address.
- */
- memset(&arpmsg, 0, sizeof(arpmsg));
- if (!get_ether_addr(hisaddr, &arpmsg.hwa)) {
- error("Cannot determine ethernet address for proxy ARP");
- return 0;
- }
-
- if ((routes = socket(PF_ROUTE, SOCK_RAW, AF_INET)) < 0) {
- error("Couldn't add proxy arp entry: socket: %m");
- return 0;
- }
-
- arpmsg.hdr.rtm_type = RTM_ADD;
- arpmsg.hdr.rtm_flags = RTF_ANNOUNCE | RTF_HOST | RTF_STATIC;
- arpmsg.hdr.rtm_version = RTM_VERSION;
- arpmsg.hdr.rtm_seq = ++rtm_seq;
- arpmsg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY;
- arpmsg.hdr.rtm_inits = RTV_EXPIRE;
- arpmsg.dst.sin_len = sizeof(struct sockaddr_inarp);
- arpmsg.dst.sin_family = AF_INET;
- arpmsg.dst.sin_addr.s_addr = hisaddr;
- arpmsg.dst.sin_other = SIN_PROXY;
-
- arpmsg.hdr.rtm_msglen = (char *) &arpmsg.hwa - (char *) &arpmsg
- + arpmsg.hwa.sdl_len;
- if (write(routes, &arpmsg, arpmsg.hdr.rtm_msglen) < 0) {
- error("Couldn't add proxy arp entry: %m");
- close(routes);
- return 0;
- }
-
- close(routes);
- arpmsg_valid = 1;
- proxy_arp_addr = hisaddr;
- return 1;
-}
-
-/*
- * cifproxyarp - Delete the proxy ARP entry for the peer.
- */
-int
-cifproxyarp(unit, hisaddr)
- int unit;
- u_int32_t hisaddr;
-{
- int routes;
-
- if (!arpmsg_valid)
- return 0;
- arpmsg_valid = 0;
-
- arpmsg.hdr.rtm_type = RTM_DELETE;
- arpmsg.hdr.rtm_seq = ++rtm_seq;
-
- if ((routes = socket(PF_ROUTE, SOCK_RAW, AF_INET)) < 0) {
- error("Couldn't delete proxy arp entry: socket: %m");
- return 0;
- }
-
- if (write(routes, &arpmsg, arpmsg.hdr.rtm_msglen) < 0) {
- error("Couldn't delete proxy arp entry: %m");
- close(routes);
- return 0;
- }
-
- close(routes);
- proxy_arp_addr = 0;
- return 1;
-}
-
-#else /* RTM_VERSION */
-
-/*
- * sifproxyarp - Make a proxy ARP entry for the peer.
- */
-int
-sifproxyarp(unit, hisaddr)
- int unit;
- u_int32_t hisaddr;
-{
- struct arpreq arpreq;
- struct {
- struct sockaddr_dl sdl;
- char space[128];
- } dls;
-
- BZERO(&arpreq, sizeof(arpreq));
-
- /*
- * Get the hardware address of an interface on the same subnet
- * as our local address.
- */
- if (!get_ether_addr(hisaddr, &dls.sdl)) {
- error("Cannot determine ethernet address for proxy ARP");
- return 0;
- }
-
- arpreq.arp_ha.sa_len = sizeof(struct sockaddr);
- arpreq.arp_ha.sa_family = AF_UNSPEC;
- BCOPY(LLADDR(&dls.sdl), arpreq.arp_ha.sa_data, dls.sdl.sdl_alen);
- SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
- ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = hisaddr;
- arpreq.arp_flags = ATF_PERM | ATF_PUBL;
- if (ioctl(sockfd, SIOCSARP, (caddr_t)&arpreq) < 0) {
- error("Couldn't add proxy arp entry: %m");
- return 0;
- }
-
- proxy_arp_addr = hisaddr;
- return 1;
-}
-
-/*
- * cifproxyarp - Delete the proxy ARP entry for the peer.
- */
-int
-cifproxyarp(unit, hisaddr)
- int unit;
- u_int32_t hisaddr;
-{
- struct arpreq arpreq;
-
- BZERO(&arpreq, sizeof(arpreq));
- SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
- ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = hisaddr;
- if (ioctl(sockfd, SIOCDARP, (caddr_t)&arpreq) < 0) {
- warn("Couldn't delete proxy arp entry: %m");
- return 0;
- }
- proxy_arp_addr = 0;
- return 1;
-}
-#endif /* RTM_VERSION */
-
-
-/*
- * get_ether_addr - get the hardware address of an interface on the
- * the same subnet as ipaddr.
- */
-#define MAX_IFS 32
-
-static int
-get_ether_addr(ipaddr, hwaddr)
- u_int32_t ipaddr;
- struct sockaddr_dl *hwaddr;
-{
- struct ifreq *ifr, *ifend, *ifp;
- u_int32_t ina, mask;
- struct sockaddr_dl *dla;
- struct ifreq ifreq;
- struct ifconf ifc;
- struct ifreq ifs[MAX_IFS];
-
- ifc.ifc_len = sizeof(ifs);
- ifc.ifc_req = ifs;
- if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
- error("ioctl(SIOCGIFCONF): %m");
- return 0;
- }
-
- /*
- * Scan through looking for an interface with an Internet
- * address on the same subnet as `ipaddr'.
- */
- ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
- for (ifr = ifc.ifc_req; ifr < ifend; ifr = (struct ifreq *)
- ((char *)&ifr->ifr_addr + ifr->ifr_addr.sa_len)) {
- if (ifr->ifr_addr.sa_family == AF_INET) {
- ina = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr;
- strlcpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
- /*
- * Check that the interface is up, and not point-to-point
- * or loopback.
- */
- if (ioctl(sockfd, SIOCGIFFLAGS, &ifreq) < 0)
- continue;
- if ((ifreq.ifr_flags &
- (IFF_UP|IFF_BROADCAST|IFF_POINTOPOINT|IFF_LOOPBACK|IFF_NOARP))
- != (IFF_UP|IFF_BROADCAST))
- continue;
- /*
- * Get its netmask and check that it's on the right subnet.
- */
- if (ioctl(sockfd, SIOCGIFNETMASK, &ifreq) < 0)
- continue;
- mask = ((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr.s_addr;
- if ((ipaddr & mask) != (ina & mask))
- continue;
-
- break;
- }
- }
-
- if (ifr >= ifend)
- return 0;
- info("found interface %s for proxy arp", ifr->ifr_name);
-
- /*
- * Now scan through again looking for a link-level address
- * for this interface.
- */
- ifp = ifr;
- for (ifr = ifc.ifc_req; ifr < ifend; ) {
- if (strcmp(ifp->ifr_name, ifr->ifr_name) == 0
- && ifr->ifr_addr.sa_family == AF_LINK) {
- /*
- * Found the link-level address - copy it out
- */
- dla = (struct sockaddr_dl *) &ifr->ifr_addr;
- BCOPY(dla, hwaddr, dla->sdl_len);
- return 1;
- }
- ifr = (struct ifreq *) ((char *)&ifr->ifr_addr + ifr->ifr_addr.sa_len);
- }
-
- return 0;
-}
-
-/*
- * Return user specified netmask, modified by any mask we might determine
- * for address `addr' (in network byte order).
- * Here we scan through the system's list of interfaces, looking for
- * any non-point-to-point interfaces which might appear to be on the same
- * network as `addr'. If we find any, we OR in their netmask to the
- * user-specified netmask.
- */
-u_int32_t
-GetMask(addr)
- u_int32_t addr;
-{
- u_int32_t mask, nmask, ina;
- struct ifreq *ifr, *ifend, ifreq;
- struct ifconf ifc;
- struct ifreq ifs[MAX_IFS];
-
- addr = ntohl(addr);
- if (IN_CLASSA(addr)) /* determine network mask for address class */
- nmask = IN_CLASSA_NET;
- else if (IN_CLASSB(addr))
- nmask = IN_CLASSB_NET;
- else
- nmask = IN_CLASSC_NET;
- /* class D nets are disallowed by bad_ip_adrs */
- mask = netmask | htonl(nmask);
-
- /*
- * Scan through the system's network interfaces.
- */
- ifc.ifc_len = sizeof(ifs);
- ifc.ifc_req = ifs;
- if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
- warn("ioctl(SIOCGIFCONF): %m");
- return mask;
- }
- ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
- for (ifr = ifc.ifc_req; ifr < ifend; ifr = (struct ifreq *)
- ((char *)&ifr->ifr_addr + ifr->ifr_addr.sa_len)) {
- /*
- * Check the interface's internet address.
- */
- if (ifr->ifr_addr.sa_family != AF_INET)
- continue;
- ina = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr;
- if ((ntohl(ina) & nmask) != (addr & nmask))
- continue;
- /*
- * Check that the interface is up, and not point-to-point or loopback.
- */
- strlcpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
- if (ioctl(sockfd, SIOCGIFFLAGS, &ifreq) < 0)
- continue;
- if ((ifreq.ifr_flags & (IFF_UP|IFF_POINTOPOINT|IFF_LOOPBACK))
- != IFF_UP)
- continue;
- /*
- * Get its netmask and OR it into our mask.
- */
- if (ioctl(sockfd, SIOCGIFNETMASK, &ifreq) < 0)
- continue;
- mask |= ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr.s_addr;
- }
-
- return mask;
-}
-
-/*
- * have_route_to - determine if the system has any route to
- * a given IP address.
- * For demand mode to work properly, we have to ignore routes
- * through our own interface.
- */
-int have_route_to(u_int32_t addr)
-{
- return -1;
-}
-
-/*
- * Use the hostid as part of the random number seed.
- */
-int
-get_host_seed()
-{
- return 17;
-}
diff --git a/c/src/libnetworking/pppd/upap.c b/c/src/libnetworking/pppd/upap.c
deleted file mode 100644
index dc6be8a98b..0000000000
--- a/c/src/libnetworking/pppd/upap.c
+++ /dev/null
@@ -1,638 +0,0 @@
-/*
- * upap.c - User/Password Authentication Protocol.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#define RCSID "$Id$"
-
-/*
- * TODO:
- */
-
-#include <stdio.h>
-#include <string.h>
-
-#include "pppd.h"
-#include "upap.h"
-
-static const char rcsid[] = RCSID;
-
-static bool hide_password = 1;
-
-/*
- * Command-line options.
- */
-static option_t pap_option_list[] = {
- { "hide-password", o_bool, &hide_password,
- "Don't output passwords to log", 1 },
- { "show-password", o_bool, &hide_password,
- "Show password string in debug log messages", 0 },
- { "pap-restart", o_int, &upap[0].us_timeouttime,
- "Set retransmit timeout for PAP" },
- { "pap-max-authreq", o_int, &upap[0].us_maxtransmits,
- "Set max number of transmissions for auth-reqs" },
- { "pap-timeout", o_int, &upap[0].us_reqtimeout,
- "Set time limit for peer PAP authentication" },
- { NULL }
-};
-
-/*
- * Protocol entry points.
- */
-static void upap_init __P((int));
-static void upap_lowerup __P((int));
-static void upap_lowerdown __P((int));
-static void upap_input __P((int, u_char *, int));
-static void upap_protrej __P((int));
-static int upap_printpkt __P((u_char *, int,
- void (*) __P((void *, char *, ...)), void *));
-
-struct protent pap_protent = {
- PPP_PAP,
- upap_init,
- upap_input,
- upap_protrej,
- upap_lowerup,
- upap_lowerdown,
- NULL,
- NULL,
- upap_printpkt,
- NULL,
- 1,
- "PAP",
- NULL,
- pap_option_list,
- NULL,
- NULL,
- NULL
-};
-
-upap_state upap[NUM_PPP]; /* UPAP state; one for each unit */
-
-static void upap_timeout __P((void *));
-static void upap_reqtimeout __P((void *));
-static void upap_rauthreq __P((upap_state *, u_char *, int, int));
-static void upap_rauthack __P((upap_state *, u_char *, int, int));
-static void upap_rauthnak __P((upap_state *, u_char *, int, int));
-static void upap_sauthreq __P((upap_state *));
-static void upap_sresp __P((upap_state *, u_char, u_char, char *, int));
-
-
-/*
- * upap_init - Initialize a UPAP unit.
- */
-static void
-upap_init(unit)
- int unit;
-{
- upap_state *u = &upap[unit];
-
- u->us_unit = unit;
- u->us_user = NULL;
- u->us_userlen = 0;
- u->us_passwd = NULL;
- u->us_passwdlen = 0;
- u->us_clientstate = UPAPCS_INITIAL;
- u->us_serverstate = UPAPSS_INITIAL;
- u->us_id = 0;
- u->us_timeouttime = UPAP_DEFTIMEOUT;
- u->us_maxtransmits = 10;
- u->us_reqtimeout = UPAP_DEFREQTIME;
-}
-
-
-/*
- * upap_authwithpeer - Authenticate us with our peer (start client).
- *
- * Set new state and send authenticate's.
- */
-void
-upap_authwithpeer(unit, user, password)
- int unit;
- char *user, *password;
-{
- upap_state *u = &upap[unit];
-
- /* Save the username and password we're given */
- u->us_user = user;
- u->us_userlen = strlen(user);
- u->us_passwd = password;
- u->us_passwdlen = strlen(password);
- u->us_transmits = 0;
-
- /* Lower layer up yet? */
- if (u->us_clientstate == UPAPCS_INITIAL ||
- u->us_clientstate == UPAPCS_PENDING) {
- u->us_clientstate = UPAPCS_PENDING;
- return;
- }
-
- upap_sauthreq(u); /* Start protocol */
-}
-
-
-/*
- * upap_authpeer - Authenticate our peer (start server).
- *
- * Set new state.
- */
-void
-upap_authpeer(unit)
- int unit;
-{
- upap_state *u = &upap[unit];
-
- /* Lower layer up yet? */
- if (u->us_serverstate == UPAPSS_INITIAL ||
- u->us_serverstate == UPAPSS_PENDING) {
- u->us_serverstate = UPAPSS_PENDING;
- return;
- }
-
- u->us_serverstate = UPAPSS_LISTEN;
- if (u->us_reqtimeout > 0)
- TIMEOUT(upap_reqtimeout, u, u->us_reqtimeout);
-}
-
-
-/*
- * upap_timeout - Retransmission timer for sending auth-reqs expired.
- */
-static void
-upap_timeout(arg)
- void *arg;
-{
- upap_state *u = (upap_state *) arg;
-
- if (u->us_clientstate != UPAPCS_AUTHREQ)
- return;
-
- if (u->us_transmits >= u->us_maxtransmits) {
- /* give up in disgust */
- error("No response to PAP authenticate-requests");
- u->us_clientstate = UPAPCS_BADAUTH;
- auth_withpeer_fail(u->us_unit, PPP_PAP);
- return;
- }
-
- upap_sauthreq(u); /* Send Authenticate-Request */
-}
-
-
-/*
- * upap_reqtimeout - Give up waiting for the peer to send an auth-req.
- */
-static void
-upap_reqtimeout(arg)
- void *arg;
-{
- upap_state *u = (upap_state *) arg;
-
- if (u->us_serverstate != UPAPSS_LISTEN)
- return; /* huh?? */
-
- auth_peer_fail(u->us_unit, PPP_PAP);
- u->us_serverstate = UPAPSS_BADAUTH;
-}
-
-
-/*
- * upap_lowerup - The lower layer is up.
- *
- * Start authenticating if pending.
- */
-static void
-upap_lowerup(unit)
- int unit;
-{
- upap_state *u = &upap[unit];
-
- if (u->us_clientstate == UPAPCS_INITIAL)
- u->us_clientstate = UPAPCS_CLOSED;
- else if (u->us_clientstate == UPAPCS_PENDING) {
- upap_sauthreq(u); /* send an auth-request */
- }
-
- if (u->us_serverstate == UPAPSS_INITIAL)
- u->us_serverstate = UPAPSS_CLOSED;
- else if (u->us_serverstate == UPAPSS_PENDING) {
- u->us_serverstate = UPAPSS_LISTEN;
- if (u->us_reqtimeout > 0)
- TIMEOUT(upap_reqtimeout, u, u->us_reqtimeout);
- }
-}
-
-
-/*
- * upap_lowerdown - The lower layer is down.
- *
- * Cancel all timeouts.
- */
-static void
-upap_lowerdown(unit)
- int unit;
-{
- upap_state *u = &upap[unit];
-
- if (u->us_clientstate == UPAPCS_AUTHREQ) /* Timeout pending? */
- UNTIMEOUT(upap_timeout, u); /* Cancel timeout */
- if (u->us_serverstate == UPAPSS_LISTEN && u->us_reqtimeout > 0)
- UNTIMEOUT(upap_reqtimeout, u);
-
- u->us_clientstate = UPAPCS_INITIAL;
- u->us_serverstate = UPAPSS_INITIAL;
-}
-
-
-/*
- * upap_protrej - Peer doesn't speak this protocol.
- *
- * This shouldn't happen. In any case, pretend lower layer went down.
- */
-static void
-upap_protrej(unit)
- int unit;
-{
- upap_state *u = &upap[unit];
-
- if (u->us_clientstate == UPAPCS_AUTHREQ) {
- error("PAP authentication failed due to protocol-reject");
- auth_withpeer_fail(unit, PPP_PAP);
- }
- if (u->us_serverstate == UPAPSS_LISTEN) {
- error("PAP authentication of peer failed (protocol-reject)");
- auth_peer_fail(unit, PPP_PAP);
- }
- upap_lowerdown(unit);
-}
-
-
-/*
- * upap_input - Input UPAP packet.
- */
-static void
-upap_input(unit, inpacket, l)
- int unit;
- u_char *inpacket;
- int l;
-{
- upap_state *u = &upap[unit];
- u_char *inp;
- u_char code, id;
- int len;
-
- /*
- * Parse header (code, id and length).
- * If packet too short, drop it.
- */
- inp = inpacket;
- if (l < UPAP_HEADERLEN) {
- UPAPDEBUG(("pap_input: rcvd short header."));
- return;
- }
- GETCHAR(code, inp);
- GETCHAR(id, inp);
- GETSHORT(len, inp);
- if (len < UPAP_HEADERLEN) {
- UPAPDEBUG(("pap_input: rcvd illegal length."));
- return;
- }
- if (len > l) {
- UPAPDEBUG(("pap_input: rcvd short packet."));
- return;
- }
- len -= UPAP_HEADERLEN;
-
- /*
- * Action depends on code.
- */
- switch (code) {
- case UPAP_AUTHREQ:
- upap_rauthreq(u, inp, id, len);
- break;
-
- case UPAP_AUTHACK:
- upap_rauthack(u, inp, id, len);
- break;
-
- case UPAP_AUTHNAK:
- upap_rauthnak(u, inp, id, len);
- break;
-
- default: /* XXX Need code reject */
- break;
- }
-}
-
-
-/*
- * upap_rauth - Receive Authenticate.
- */
-static void
-upap_rauthreq(u, inp, id, len)
- upap_state *u;
- u_char *inp;
- int id;
- int len;
-{
- u_char ruserlen, rpasswdlen;
- char *ruser, *rpasswd;
- int retcode;
- char *msg;
- int msglen;
-
- if (u->us_serverstate < UPAPSS_LISTEN)
- return;
-
- /*
- * If we receive a duplicate authenticate-request, we are
- * supposed to return the same status as for the first request.
- */
- if (u->us_serverstate == UPAPSS_OPEN) {
- upap_sresp(u, UPAP_AUTHACK, id, "", 0); /* return auth-ack */
- return;
- }
- if (u->us_serverstate == UPAPSS_BADAUTH) {
- upap_sresp(u, UPAP_AUTHNAK, id, "", 0); /* return auth-nak */
- return;
- }
-
- /*
- * Parse user/passwd.
- */
- if (len < 1) {
- UPAPDEBUG(("pap_rauth: rcvd short packet."));
- return;
- }
- GETCHAR(ruserlen, inp);
- len -= sizeof (u_char) + ruserlen + sizeof (u_char);
- if (len < 0) {
- UPAPDEBUG(("pap_rauth: rcvd short packet."));
- return;
- }
- ruser = (char *) inp;
- INCPTR(ruserlen, inp);
- GETCHAR(rpasswdlen, inp);
- if (len < rpasswdlen) {
- UPAPDEBUG(("pap_rauth: rcvd short packet."));
- return;
- }
- rpasswd = (char *) inp;
-
- /*
- * Check the username and password given.
- */
- retcode = check_passwd(u->us_unit, ruser, ruserlen, rpasswd,
- rpasswdlen, &msg);
- BZERO(rpasswd, rpasswdlen);
- msglen = strlen(msg);
- if (msglen > 255)
- msglen = 255;
-
- upap_sresp(u, retcode, id, msg, msglen);
-
- if (retcode == UPAP_AUTHACK) {
- u->us_serverstate = UPAPSS_OPEN;
- auth_peer_success(u->us_unit, PPP_PAP, ruser, ruserlen);
- } else {
- u->us_serverstate = UPAPSS_BADAUTH;
- auth_peer_fail(u->us_unit, PPP_PAP);
- }
-
- if (u->us_reqtimeout > 0)
- UNTIMEOUT(upap_reqtimeout, u);
-}
-
-
-/*
- * upap_rauthack - Receive Authenticate-Ack.
- */
-static void
-upap_rauthack(u, inp, id, len)
- upap_state *u;
- u_char *inp;
- int id;
- int len;
-{
- u_char msglen;
- char *msg;
-
- if (u->us_clientstate != UPAPCS_AUTHREQ) /* XXX */
- return;
-
- /*
- * Parse message.
- */
- if (len < 1) {
- UPAPDEBUG(("pap_rauthack: ignoring missing msg-length."));
- } else {
- GETCHAR(msglen, inp);
- if (msglen > 0) {
- len -= sizeof (u_char);
- if (len < msglen) {
- UPAPDEBUG(("pap_rauthack: rcvd short packet."));
- return;
- }
- msg = (char *) inp;
- PRINTMSG(msg, msglen);
- }
- }
-
- u->us_clientstate = UPAPCS_OPEN;
-
- auth_withpeer_success(u->us_unit, PPP_PAP);
-}
-
-
-/*
- * upap_rauthnak - Receive Authenticate-Nakk.
- */
-static void
-upap_rauthnak(u, inp, id, len)
- upap_state *u;
- u_char *inp;
- int id;
- int len;
-{
- u_char msglen;
- char *msg;
-
- if (u->us_clientstate != UPAPCS_AUTHREQ) /* XXX */
- return;
-
- /*
- * Parse message.
- */
- if (len < 1) {
- UPAPDEBUG(("pap_rauthnak: ignoring missing msg-length."));
- } else {
- GETCHAR(msglen, inp);
- if (msglen > 0) {
- len -= sizeof (u_char);
- if (len < msglen) {
- UPAPDEBUG(("pap_rauthnak: rcvd short packet."));
- return;
- }
- msg = (char *) inp;
- PRINTMSG(msg, msglen);
- }
- }
-
- u->us_clientstate = UPAPCS_BADAUTH;
-
- error("PAP authentication failed");
- auth_withpeer_fail(u->us_unit, PPP_PAP);
-}
-
-
-/*
- * upap_sauthreq - Send an Authenticate-Request.
- */
-static void
-upap_sauthreq(u)
- upap_state *u;
-{
- u_char *outp;
- int outlen;
-
- outlen = UPAP_HEADERLEN + 2 * sizeof (u_char) +
- u->us_userlen + u->us_passwdlen;
- outp = outpacket_buf;
-
- MAKEHEADER(outp, PPP_PAP);
-
- PUTCHAR(UPAP_AUTHREQ, outp);
- PUTCHAR(++u->us_id, outp);
- PUTSHORT(outlen, outp);
- PUTCHAR(u->us_userlen, outp);
- BCOPY(u->us_user, outp, u->us_userlen);
- INCPTR(u->us_userlen, outp);
- PUTCHAR(u->us_passwdlen, outp);
- BCOPY(u->us_passwd, outp, u->us_passwdlen);
-
- output(u->us_unit, outpacket_buf, outlen + PPP_HDRLEN);
-
- TIMEOUT(upap_timeout, u, u->us_timeouttime);
- ++u->us_transmits;
- u->us_clientstate = UPAPCS_AUTHREQ;
-}
-
-
-/*
- * upap_sresp - Send a response (ack or nak).
- */
-static void
-upap_sresp(u, code, id, msg, msglen)
- upap_state *u;
- u_char code, id;
- char *msg;
- int msglen;
-{
- u_char *outp;
- int outlen;
-
- outlen = UPAP_HEADERLEN + sizeof (u_char) + msglen;
- outp = outpacket_buf;
- MAKEHEADER(outp, PPP_PAP);
-
- PUTCHAR(code, outp);
- PUTCHAR(id, outp);
- PUTSHORT(outlen, outp);
- PUTCHAR(msglen, outp);
- BCOPY(msg, outp, msglen);
- output(u->us_unit, outpacket_buf, outlen + PPP_HDRLEN);
-}
-
-/*
- * upap_printpkt - print the contents of a PAP packet.
- */
-static char *upap_codenames[] = {
- "AuthReq", "AuthAck", "AuthNak"
-};
-
-static int
-upap_printpkt(p, plen, printer, arg)
- u_char *p;
- int plen;
- void (*printer) __P((void *, char *, ...));
- void *arg;
-{
- int code, id, len;
- int mlen, ulen, wlen;
- char *user, *pwd, *msg;
- u_char *pstart;
-
- if (plen < UPAP_HEADERLEN)
- return 0;
- pstart = p;
- GETCHAR(code, p);
- GETCHAR(id, p);
- GETSHORT(len, p);
- if (len < UPAP_HEADERLEN || len > plen)
- return 0;
-
- if (code >= 1 && code <= sizeof(upap_codenames) / sizeof(char *))
- printer(arg, " %s", upap_codenames[code-1]);
- else
- printer(arg, " code=0x%x", code);
- printer(arg, " id=0x%x", id);
- len -= UPAP_HEADERLEN;
- switch (code) {
- case UPAP_AUTHREQ:
- if (len < 1)
- break;
- ulen = p[0];
- if (len < ulen + 2)
- break;
- wlen = p[ulen + 1];
- if (len < ulen + wlen + 2)
- break;
- user = (char *) (p + 1);
- pwd = (char *) (p + ulen + 2);
- p += ulen + wlen + 2;
- len -= ulen + wlen + 2;
- printer(arg, " user=");
- print_string(user, ulen, printer, arg);
- printer(arg, " password=");
- if (!hide_password)
- print_string(pwd, wlen, printer, arg);
- else
- printer(arg, "<hidden>");
- break;
- case UPAP_AUTHACK:
- case UPAP_AUTHNAK:
- if (len < 1)
- break;
- mlen = p[0];
- if (len < mlen + 1)
- break;
- msg = (char *) (p + 1);
- p += mlen + 1;
- len -= mlen + 1;
- printer(arg, " ");
- print_string(msg, mlen, printer, arg);
- break;
- }
-
- /* print the rest of the bytes in the packet */
- for (; len > 0; --len) {
- GETCHAR(code, p);
- printer(arg, " %.2x", code);
- }
-
- return p - pstart;
-}
diff --git a/c/src/libnetworking/pppd/upap.h b/c/src/libnetworking/pppd/upap.h
deleted file mode 100644
index 6d5bf64026..0000000000
--- a/c/src/libnetworking/pppd/upap.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * upap.h - User/Password Authentication Protocol definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id$
- */
-
-/*
- * Packet header = Code, id, length.
- */
-#define UPAP_HEADERLEN 4
-
-
-/*
- * UPAP codes.
- */
-#define UPAP_AUTHREQ 1 /* Authenticate-Request */
-#define UPAP_AUTHACK 2 /* Authenticate-Ack */
-#define UPAP_AUTHNAK 3 /* Authenticate-Nak */
-
-
-/*
- * Each interface is described by upap structure.
- */
-typedef struct upap_state {
- int us_unit; /* Interface unit number */
- char *us_user; /* User */
- int us_userlen; /* User length */
- char *us_passwd; /* Password */
- int us_passwdlen; /* Password length */
- int us_clientstate; /* Client state */
- int us_serverstate; /* Server state */
- u_char us_id; /* Current id */
- int us_timeouttime; /* Timeout (seconds) for auth-req retrans. */
- int us_transmits; /* Number of auth-reqs sent */
- int us_maxtransmits; /* Maximum number of auth-reqs to send */
- int us_reqtimeout; /* Time to wait for auth-req from peer */
-} upap_state;
-
-
-/*
- * Client states.
- */
-#define UPAPCS_INITIAL 0 /* Connection down */
-#define UPAPCS_CLOSED 1 /* Connection up, haven't requested auth */
-#define UPAPCS_PENDING 2 /* Connection down, have requested auth */
-#define UPAPCS_AUTHREQ 3 /* We've sent an Authenticate-Request */
-#define UPAPCS_OPEN 4 /* We've received an Ack */
-#define UPAPCS_BADAUTH 5 /* We've received a Nak */
-
-/*
- * Server states.
- */
-#define UPAPSS_INITIAL 0 /* Connection down */
-#define UPAPSS_CLOSED 1 /* Connection up, haven't requested auth */
-#define UPAPSS_PENDING 2 /* Connection down, have requested auth */
-#define UPAPSS_LISTEN 3 /* Listening for an Authenticate */
-#define UPAPSS_OPEN 4 /* We've sent an Ack */
-#define UPAPSS_BADAUTH 5 /* We've sent a Nak */
-
-
-/*
- * Timeouts.
- */
-#define UPAP_DEFTIMEOUT 5 /* Timeout (seconds) for retransmitting req */
-#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */
-
-extern upap_state upap[];
-
-void upap_authwithpeer __P((int, char *, char *));
-void upap_authpeer __P((int));
-
-extern struct protent pap_protent;
diff --git a/c/src/libnetworking/pppd/utils.c b/c/src/libnetworking/pppd/utils.c
deleted file mode 100644
index 15cdf6b763..0000000000
--- a/c/src/libnetworking/pppd/utils.c
+++ /dev/null
@@ -1,833 +0,0 @@
-/*
- * utils.c - various utility functions used in pppd.
- *
- * Copyright (c) 1999 The Australian National University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the Australian National University. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#define RCSID "$Id$"
-
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <signal.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <netdb.h>
-#include <syslog.h>
-#include <pwd.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#ifdef SVR4
-#include <sys/mkdev.h>
-#endif
-
-#include "pppd.h"
-
-static const char rcsid[] = RCSID;
-
-#if defined(SUNOS4)
-extern char *strerror();
-#endif
-
-static void pr_log __P((void *, char *, ...));
-static void logit __P((int, char *, va_list));
-static void vslp_printer __P((void *, char *, ...));
-static void format_packet __P((u_char *, int, void (*) (void *, char *, ...),
- void *));
-
-struct buffer_info {
- char *ptr;
- int len;
-};
-
-/*
- * slprintf - format a message into a buffer. Like sprintf except we
- * also specify the length of the output buffer, and we handle
- * %r (recursive format), %m (error message), %v (visible string),
- * %q (quoted string), %t (current time) and %I (IP address) formats.
- * Doesn't do floating-point formats.
- * Returns the number of chars put into buf.
- */
-int
-slprintf __V((char *buf, int buflen, char *fmt, ...))
-{
- va_list args;
- int n;
-
-#if defined(__STDC__)
- va_start(args, fmt);
-#else
- char *buf;
- int buflen;
- char *fmt;
- va_start(args);
- buf = va_arg(args, char *);
- buflen = va_arg(args, int);
- fmt = va_arg(args, char *);
-#endif
- n = vslprintf(buf, buflen, fmt, args);
- va_end(args);
- return n;
-}
-
-/*
- * vslprintf - like slprintf, takes a va_list instead of a list of args.
- */
-#define OUTCHAR(c) (buflen > 0? (--buflen, *buf++ = (c)): 0)
-
-int
-vslprintf(buf, buflen, fmt, args)
- char *buf;
- int buflen;
- char *fmt;
- va_list args;
-{
- int c, i, n;
- int width, prec, fillch;
- int base, len, neg, quoted;
- unsigned long val = 0;
- char *str, *f, *buf0;
- unsigned char *p;
- char num[32];
- time_t t;
- u_int32_t ip;
- static char hexchars[] = "0123456789abcdef";
- struct buffer_info bufinfo;
-
- buf0 = buf;
- --buflen;
- while (buflen > 0) {
- for (f = fmt; *f != '%' && *f != 0; ++f)
- ;
- if (f > fmt) {
- len = f - fmt;
- if (len > buflen)
- len = buflen;
- memcpy(buf, fmt, len);
- buf += len;
- buflen -= len;
- fmt = f;
- }
- if (*fmt == 0)
- break;
- c = *++fmt;
- width = 0;
- prec = -1;
- fillch = ' ';
- if (c == '0') {
- fillch = '0';
- c = *++fmt;
- }
- if (c == '*') {
- width = va_arg(args, int);
- c = *++fmt;
- } else {
- while (isdigit(c)) {
- width = width * 10 + c - '0';
- c = *++fmt;
- }
- }
- if (c == '.') {
- c = *++fmt;
- if (c == '*') {
- prec = va_arg(args, int);
- c = *++fmt;
- } else {
- prec = 0;
- while (isdigit(c)) {
- prec = prec * 10 + c - '0';
- c = *++fmt;
- }
- }
- }
- str = 0;
- base = 0;
- neg = 0;
- ++fmt;
- switch (c) {
- case 'd':
- i = va_arg(args, int);
- if (i < 0) {
- neg = 1;
- val = -i;
- } else
- val = i;
- base = 10;
- break;
- case 'o':
- val = va_arg(args, unsigned int);
- base = 8;
- break;
- case 'x':
- case 'X':
- val = va_arg(args, unsigned int);
- base = 16;
- break;
- case 'p':
- val = (unsigned long) va_arg(args, void *);
- base = 16;
- neg = 2;
- break;
- case 's':
- str = va_arg(args, char *);
- break;
- case 'c':
- num[0] = va_arg(args, int);
- num[1] = 0;
- str = num;
- break;
- case 'm':
- str = strerror(errno);
- break;
- case 'I':
- ip = va_arg(args, u_int32_t);
- ip = ntohl(ip);
- slprintf(num, sizeof(num), "%d.%d.%d.%d", (ip >> 24) & 0xff,
- (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
- str = num;
- break;
- case 'r':
- f = va_arg(args, char *);
-#if !defined(__PPC__)
- n = vslprintf(buf, buflen + 1, f, va_arg(args, va_list));
-#else
- /* HACK: On the powerpc, a va_list is an array of 1 structure */
- n = vslprintf(buf, buflen + 1, f, va_arg(args, void *));
-#endif
- buf += n;
- buflen -= n;
- continue;
- case 't':
- time(&t);
- str = ctime(&t);
- str += 4; /* chop off the day name */
- str[15] = 0; /* chop off year and newline */
- break;
- case 'v': /* "visible" string */
- case 'q': /* quoted string */
- quoted = c == 'q';
- p = va_arg(args, unsigned char *);
- if (fillch == '0' && prec >= 0) {
- n = prec;
- } else {
- n = strlen((char *)p);
- if (prec >= 0 && n > prec)
- n = prec;
- }
- while (n > 0 && buflen > 0) {
- c = *p++;
- --n;
- if (!quoted && c >= 0x80) {
- OUTCHAR('M');
- OUTCHAR('-');
- c -= 0x80;
- }
- if (quoted && (c == '"' || c == '\\'))
- OUTCHAR('\\');
- if (c < 0x20 || (0x7f <= c && c < 0xa0)) {
- if (quoted) {
- OUTCHAR('\\');
- switch (c) {
- case '\t': OUTCHAR('t'); break;
- case '\n': OUTCHAR('n'); break;
- case '\b': OUTCHAR('b'); break;
- case '\f': OUTCHAR('f'); break;
- default:
- OUTCHAR('x');
- OUTCHAR(hexchars[c >> 4]);
- OUTCHAR(hexchars[c & 0xf]);
- }
- } else {
- if (c == '\t')
- OUTCHAR(c);
- else {
- OUTCHAR('^');
- OUTCHAR(c ^ 0x40);
- }
- }
- } else
- OUTCHAR(c);
- }
- continue;
- case 'P': /* print PPP packet */
- bufinfo.ptr = buf;
- bufinfo.len = buflen + 1;
- p = va_arg(args, unsigned char *);
- n = va_arg(args, int);
- format_packet(p, n, vslp_printer, &bufinfo);
- buf = bufinfo.ptr;
- buflen = bufinfo.len - 1;
- continue;
- case 'B':
- p = va_arg(args, unsigned char *);
- for (n = prec; n > 0; --n) {
- c = *p++;
- if (fillch == ' ')
- OUTCHAR(' ');
- OUTCHAR(hexchars[(c >> 4) & 0xf]);
- OUTCHAR(hexchars[c & 0xf]);
- }
- continue;
- default:
- *buf++ = '%';
- if (c != '%')
- --fmt; /* so %z outputs %z etc. */
- --buflen;
- continue;
- }
- if (base != 0) {
- str = num + sizeof(num);
- *--str = 0;
- while (str > num + neg) {
- *--str = hexchars[val % base];
- val = val / base;
- if (--prec <= 0 && val == 0)
- break;
- }
- switch (neg) {
- case 1:
- *--str = '-';
- break;
- case 2:
- *--str = 'x';
- *--str = '0';
- break;
- }
- len = num + sizeof(num) - 1 - str;
- } else {
- len = strlen(str);
- if (prec >= 0 && len > prec)
- len = prec;
- }
- if (width > 0) {
- if (width > buflen)
- width = buflen;
- if ((n = width - len) > 0) {
- buflen -= n;
- for (; n > 0; --n)
- *buf++ = fillch;
- }
- }
- if (len > buflen)
- len = buflen;
- memcpy(buf, str, len);
- buf += len;
- buflen -= len;
- }
- *buf = 0;
- return buf - buf0;
-}
-
-/*
- * vslp_printer - used in processing a %P format
- */
-static void
-vslp_printer __V((void *arg, char *fmt, ...))
-{
- int n;
- va_list pvar;
- struct buffer_info *bi;
-
-#if defined(__STDC__)
- va_start(pvar, fmt);
-#else
- void *arg;
- char *fmt;
- va_start(pvar);
- arg = va_arg(pvar, void *);
- fmt = va_arg(pvar, char *);
-#endif
-
- bi = (struct buffer_info *) arg;
- n = vslprintf(bi->ptr, bi->len, fmt, pvar);
- va_end(pvar);
-
- bi->ptr += n;
- bi->len -= n;
-}
-
-/*
- * log_packet - format a packet and log it.
- */
-
-char line[256]; /* line to be logged accumulated here */
-char *linep;
-
-void
-log_packet(p, len, prefix, level)
- u_char *p;
- int len;
- char *prefix;
- int level;
-{
- strlcpy(line, prefix, sizeof(line));
- linep = line + strlen(line);
- format_packet(p, len, pr_log, NULL);
-}
-
-/*
- * format_packet - make a readable representation of a packet,
- * calling `printer(arg, format, ...)' to output it.
- */
-static void
-format_packet(p, len, printer, arg)
- u_char *p;
- int len;
- void (*printer) __P((void *, char *, ...));
- void *arg;
-{
- int i, n;
- u_short proto;
- struct protent *protp;
-
- if (len >= PPP_HDRLEN && p[0] == PPP_ALLSTATIONS && p[1] == PPP_UI) {
- p += 2;
- GETSHORT(proto, p);
- len -= PPP_HDRLEN;
- for (i = 0; (protp = protocols[i]) != NULL; ++i)
- if (proto == protp->protocol)
- break;
- if (protp != NULL) {
- printer(arg, "[%s", protp->name);
- n = (*protp->printpkt)(p, len, printer, arg);
- printer(arg, "]");
- p += n;
- len -= n;
- } else {
- for (i = 0; (protp = protocols[i]) != NULL; ++i)
- if (proto == (protp->protocol & ~0x8000))
- break;
- if (protp != 0 && protp->data_name != 0) {
- printer(arg, "[%s data]", protp->data_name);
- if (len > 8)
- printer(arg, "%.8B ...", p);
- else
- printer(arg, "%.*B", len, p);
- len = 0;
- } else
- printer(arg, "[proto=0x%x]", proto);
- }
- }
-
- if (len > 32)
- printer(arg, "%.32B ...", p);
- else
- printer(arg, "%.*B", len, p);
-}
-
-static void
-pr_log __V((void *arg, char *fmt, ...))
-{
- int n;
- va_list pvar;
- char buf[256];
-
-#if defined(__STDC__)
- va_start(pvar, fmt);
-#else
- void *arg;
- char *fmt;
- va_start(pvar);
- arg = va_arg(pvar, void *);
- fmt = va_arg(pvar, char *);
-#endif
-
- n = vslprintf(buf, sizeof(buf), fmt, pvar);
- va_end(pvar);
-
- if (linep + n + 1 > line + sizeof(line)) {
- linep = line;
- }
- strlcpy(linep, buf, line + sizeof(line) - linep);
- linep += n;
-}
-
-/*
- * print_string - print a readable representation of a string using
- * printer.
- */
-void
-print_string(p_arg, len, printer, arg)
- void *p_arg;
- int len;
- void (*printer) __P((void *, char *, ...));
- void *arg;
-{
- int c;
- unsigned char *p = (unsigned char *)p_arg;
-
- printer(arg, "\"");
- for (; len > 0; --len) {
- c = *p++;
- if (' ' <= c && c <= '~') {
- if (c == '\\' || c == '"')
- printer(arg, "\\");
- printer(arg, "%c", c);
- } else {
- switch (c) {
- case '\n':
- printer(arg, "\\n");
- break;
- case '\r':
- printer(arg, "\\r");
- break;
- case '\t':
- printer(arg, "\\t");
- break;
- default:
- printer(arg, "\\%.3o", c);
- }
- }
- }
- printer(arg, "\"");
-}
-
-/*
- * logit - does the hard work for fatal et al.
- */
-static void
-logit(level, fmt, args)
- int level;
- char *fmt;
- va_list args;
-{
- int n;
- char buf[256];
-
- n = vslprintf(buf, sizeof(buf), fmt, args);
-/* if (log_to_fd >= 0 && (level != LOG_DEBUG || debug)) { */
- if (log_to_fd >= 0 && (debug)) {
- if (buf[n-1] != '\n')
- buf[n++] = '\n';
- if (write(log_to_fd, buf, n) != n)
- log_to_fd = -1;
- }
-}
-
-/*
- * fatal - log an error message and die horribly.
- */
-void
-pppd_fatal __V((char *fmt, ...))
-{
- va_list pvar;
-
-#if defined(__STDC__)
- va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
-
- logit(LOG_ERR, fmt, pvar);
- va_end(pvar);
-
- die(1); /* as promised */
-}
-
-/*
- * error - log an error message.
- */
-void
-pppd_error __V((char *fmt, ...))
-{
- va_list pvar;
-
-#if defined(__STDC__)
- va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
-
- logit(LOG_ERR, fmt, pvar);
- va_end(pvar);
-}
-
-/*
- * warn - log a warning message.
- */
-void
-pppd_warn __V((char *fmt, ...))
-{
- va_list pvar;
-
-#if defined(__STDC__)
- va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
-
- logit(LOG_WARNING, fmt, pvar);
- va_end(pvar);
-}
-
-/*
- * notice - log a notice-level message.
- */
-void
-pppd_notice __V((char *fmt, ...))
-{
- va_list pvar;
-
-#if defined(__STDC__)
- va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
-
- logit(LOG_NOTICE, fmt, pvar);
- va_end(pvar);
-}
-
-/*
- * info - log an informational message.
- */
-void
-pppd_info __V((char *fmt, ...))
-{
- va_list pvar;
-
-#if defined(__STDC__)
- va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
-
- logit(LOG_INFO, fmt, pvar);
- va_end(pvar);
-}
-
-/*
- * dbglog - log a debug message.
- */
-void
-pppd_dbglog __V((char *fmt, ...))
-{
- va_list pvar;
-
-#if defined(__STDC__)
- va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
-
- logit(LOG_DEBUG, fmt, pvar);
- va_end(pvar);
-}
-
-/* Procedures for locking the serial device using a lock file. */
-#ifndef LOCK_DIR
-#ifdef _linux_
-#define LOCK_DIR "/var/lock"
-#else
-#ifdef SVR4
-#define LOCK_DIR "/var/spool/locks"
-#else
-#define LOCK_DIR "/var/spool/lock"
-#endif
-#endif
-#endif /* LOCK_DIR */
-
-static char lock_file[MAXPATHLEN];
-
-/*
- * lock - create a lock file for the named device
- */
-int
-lock(dev)
- char *dev;
-{
-#ifdef LOCKLIB
- int result;
-
- result = mklock (dev, (void *) 0);
- if (result == 0) {
- strlcpy(lock_file, sizeof(lock_file), dev);
- return 0;
- }
-
- if (result > 0)
- notice("Device %s is locked by pid %d", dev, result);
- else
- error("Can't create lock file %s", lock_file);
- return -1;
-
-#else /* LOCKLIB */
-
- char lock_buffer[12];
- int fd, pid, n;
-
-#ifdef SVR4
- struct stat sbuf;
-
- if (stat(dev, &sbuf) < 0) {
- error("Can't get device number for %s: %m", dev);
- return -1;
- }
- if ((sbuf.st_mode & S_IFMT) != S_IFCHR) {
- error("Can't lock %s: not a character device", dev);
- return -1;
- }
- slprintf(lock_file, sizeof(lock_file), "%s/LK.%03d.%03d.%03d",
- LOCK_DIR, major(sbuf.st_dev),
- major(sbuf.st_rdev), minor(sbuf.st_rdev));
-#else
- char *p;
-
- if ((p = strrchr(dev, '/')) != NULL)
- dev = p + 1;
- slprintf(lock_file, sizeof(lock_file), "%s/LCK..%s", LOCK_DIR, dev);
-#endif
-
- while ((fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR, 0644)) < 0) {
- if (errno != EEXIST) {
- error("Can't create lock file %s: %m", lock_file);
- break;
- }
-
- /* Read the lock file to find out who has the device locked. */
- fd = open(lock_file, O_RDONLY, 0);
- if (fd < 0) {
- if (errno == ENOENT) /* This is just a timing problem. */
- continue;
- error("Can't open existing lock file %s: %m", lock_file);
- break;
- }
-#ifndef LOCK_BINARY
- n = read(fd, lock_buffer, 11);
-#else
- n = read(fd, &pid, sizeof(pid));
-#endif /* LOCK_BINARY */
- close(fd);
- fd = -1;
- if (n <= 0) {
- error("Can't read pid from lock file %s", lock_file);
- break;
- }
-
- /* See if the process still exists. */
-#ifndef LOCK_BINARY
- lock_buffer[n] = 0;
- pid = atoi(lock_buffer);
-#endif /* LOCK_BINARY */
- if (pid == getpid())
- return 1; /* somebody else locked it for us */
- if (pid == 0
- || (kill(pid, 0) == -1 && errno == ESRCH)) {
- if (unlink (lock_file) == 0) {
- notice("Removed stale lock on %s (pid %d)", dev, pid);
- continue;
- }
- warn("Couldn't remove stale lock on %s", dev);
- } else
- notice("Device %s is locked by pid %d", dev, pid);
- break;
- }
-
- if (fd < 0) {
- lock_file[0] = 0;
- return -1;
- }
-
- pid = getpid();
-#ifndef LOCK_BINARY
- slprintf(lock_buffer, sizeof(lock_buffer), "%10d\n", pid);
- write (fd, lock_buffer, 11);
-#else
- write(fd, &pid, sizeof (pid));
-#endif
- close(fd);
- return 0;
-
-#endif
-}
-
-/*
- * relock - called to update our lockfile when we are about to detach,
- * thus changing our pid (we fork, the child carries on, and the parent dies).
- * Note that this is called by the parent, with pid equal to the pid
- * of the child. This avoids a potential race which would exist if
- * we had the child rewrite the lockfile (the parent might die first,
- * and another process could think the lock was stale if it checked
- * between when the parent died and the child rewrote the lockfile).
- */
-int
-relock(pid)
- int pid;
-{
-#ifdef LOCKLIB
- /* XXX is there a way to do this? */
- return -1;
-#else /* LOCKLIB */
-
- int fd;
- char lock_buffer[12];
-
- if (lock_file[0] == 0)
- return -1;
- fd = open(lock_file, O_WRONLY, 0);
- if (fd < 0) {
- error("Couldn't reopen lock file %s: %m", lock_file);
- lock_file[0] = 0;
- return -1;
- }
-
-#ifndef LOCK_BINARY
- slprintf(lock_buffer, sizeof(lock_buffer), "%10d\n", pid);
- write (fd, lock_buffer, 11);
-#else
- write(fd, &pid, sizeof(pid));
-#endif /* LOCK_BINARY */
- close(fd);
- return 0;
-
-#endif /* LOCKLIB */
-}
-
-/*
- * unlock - remove our lockfile
- */
-void
-unlock()
-{
- if (lock_file[0]) {
-#ifdef LOCKLIB
- (void) rmlock(lock_file, (void *) 0);
-#else
- unlink(lock_file);
-#endif
- lock_file[0] = 0;
- }
-}